البحث في عمود يحتوي على بيانات CSV في جدول MySQL لوجود قيم الإدخال

StackOverflow https://stackoverflow.com/questions/2857024

سؤال

لدي جدول يقول ، العنصر ، في MySQL الذي يخزن البيانات على النحو التالي:

ID    FEATURES
--------------------
1     AB,CD,EF,XY
2     PQ,AC,A3,B3
3     AB,CDE
4     AB1,BC3
--------------------

كمدخل ، سأحصل على سلسلة CSV ، شيء مثل "AB ، PQ". أريد الحصول على السجلات التي تحتوي على AB أو PQ. أدركت أنه يجب علينا كتابة وظيفة MySQL لتحقيق ذلك. لذا ، إذا كان لدينا هذه الوظيفة السحرية التي تم تعريفها في MySQL والتي تقوم بذلك ، فسأقوم ببساطة بتنفيذ SQL على النحو التالي:

select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0

سيعود الاستعلام أعلاه السجلات 1 و 2 و 3.

لكنني أواجه جميع أنواع المشكلات أثناء تنفيذ هذه الوظيفة حيث أدركت أن MySQL لا يدعم المصفوفات وليس هناك طريقة بسيطة لتقسيم الأوتار بناءً على محدد.

إعادة تشكيل الجدول هو الخيار الأخير بالنسبة لي لأنه يتضمن الكثير من المشكلات.

قد أرغب أيضًا في تنفيذ استفسارات تحتوي على وظائف Match_any متعددة مثل:

select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")

في الحالة المذكورة أعلاه ، سنحصل على تقاطع السجلات (1 ، 2 ، 3) و (3) التي ستكون 3 فقط.

وهي محط تقدير بالغ أي مساعدة.

شكرًا

هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، يجب أن تحتوي قاعدة البيانات بالطبع على قيم مفصولة فاصلة ، لكنك نأمل أن تكون على دراية بذلك بالفعل. إذا تم تطبيع الجدول ، فيمكنك بسهولة الحصول على العناصر باستخدام استعلام مثل:

select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')

يمكنك مطابقة الأوتار في القيم المنفصلة للفاصلة ، لكنها ليست فعالة للغاية:

select Id
from Item
where
  instr(concat(',', Features, ','), ',AB,') <> 0 or
  instr(concat(',', Features, ','), ',PQ,') <> 0

نصائح أخرى

select * 
  from ITEM where 
 where CONCAT(',',FEAURES,',') LIKE '%,AB,%'
    or CONCAT(',',FEAURES,',') LIKE '%,PQ,%'

أو قم بإنشاء وظيفة مخصصة للقيام بـ Match_any

على كل ما تبذلونه من عشاق regexp هناك ، اعتقدت أنني سأضيف هذا كحل:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';

ولحساسة الحالة:

SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';

للاستعلام الثاني:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];

هتافات!

بدلاً من ذلك ، فكر في استخدام RIKE ()

    select * 
      from ITEM
     where ','+FEATURES+',' RLIKE ',AB,|,PQ,'; 

مجرد فكرة:

هل يجب القيام به في SQL؟ هذا هو نوع الشيء الذي قد تتوقع عادة أن تكتبه في PHP أو Python أو أي لغة تستخدمها للتفاعل مع قاعدة البيانات.

يعني هذا النهج أنه يمكنك إنشاء سلسلة الاستعلام الخاصة بك باستخدام أي منطق معقد تحتاجه ، ثم فقط أرسل استعلام الفانيليا SQL ، بدلاً من محاولة إنشاء إجراء في SQL.

بن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top