يمكن أن أقارن تتضمن التعدادات الخلية؟
سؤال
ولدي التعداد: ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
إذا كنت فرز مائدتي بحسب هذا الحقل أحصل عليها بالترتيب الصحيح المحدد أعلاه.
ولكن، لا أستطيع أن أجد وسيلة لتحديد مجموعة فرعية من هذه، على سبيل المثال كل شيء قبل الدلتا. باستخدام WHERE status < 'delta'
يعود فقط ألفا وبيتا، وليس غاما. يبدو الخلية يستخدم مقارنة سلسلة، وليس مقارنة مؤشر التعداد.
وأنا يمكن استخدام الأرقام القياسية - أي WHERE status < 4
- لكنه قليلا من رائحة الكود (أرقام السحر)، ويمكن كسر إذا كنت إدراج قيم جديدة في التعداد
المحلول
وأنت تحاول استخدام أساليب معالجة البيانات على الفوقية، وهذا لا بد أن يكون محرجا.
وهذا هو سبب وجيه لتحل محل ENUM
مع مفتاح خارجي إلى جدول بحث. ثم يمكنك استخدام تقنيات معالجة البيانات التقليدية.
نصائح أخرى
ويمكنك استخدام status+0
للعودة المؤشر من التعداد، بدءا من 1.
وجاء فقط عبر نفس القضية. إذا كنت تريد فرز حقل التعداد عليك أن يطرح للنوع سلسلة الأول (الفئة هي مجال التعداد بلدي في المثال):
SELECT
CONVERT(category USING utf8) as str_category
FROM
example
GROUP BY
str_category
ORDER BY
str_category
وإيزي!
ويمكنك استخدام FIELD(column, "string1", "string2", ...)
ل تجد الصفوف مع أي مجموعة فرعية معينة من القيم ENUM
الممكنة.
SELECT * FROM `table` WHERE FIELD(`enum_column`, "alpha", "delta", "et cetera");
إذا كنت تريد استخدام النسخة المدى، يمكنك استخدام <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set" يختلط = "نوفولو noreferrer"> FIND_IN_SET("needle", "hay,stack")
ليعود المؤشر ولكن سيكون لديك لاستخراج قائمة التعداد من تعريف الجدول الأول مع استعلام آخر.
وإنشاء دالة:
CREATE fEnumIndex(_table VARCHAR(50), _col VARCHAR(50), _val VARCHAR(50))
RETURNS INT DETERMINISTIC
BEGIN
DECLARE _lst VARCHAR(8192);
DECLARE _ndx INT;
SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND
TABLE_NAME=_table AND COLUMN_NAME=_col INTO _lst;
SET _ndx = FIND_IN_SET(_val, _lst);
RETURN _ndx;
END
وثم استخدامها في استعلام كما يلي:
SELECT * FROM MyTable WHERE Status < fEnumIndex('MyTable','Status','delta') ;
ووSELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
سيأخذ COLUMN_TYPE
مثل ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
وتحويلها إلى قائمة مفصولة بفواصل: 'alpha, beta, gamma, delta, omega'
. ثم FIND_IN_SET(_val, _lst)
يحصل على المؤشر.
والشيء الوحيد الذي عليك أن تكون حذرا مع هو كيفية تعريف تتضمن التعدادات (مع أو بدون مسافات بين العناصر) وREPLACE
الداخلية الأكثر (مع أو بدون مساحة في from_string).