質問
列挙があります:ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )
この列でテーブルをソートすると、上記で定義した正しい順序でテーブルが取得されます。
ただし、これらのサブセットを選択する方法が見つかりません。デルタの前のすべて。 WHERE status < 'delta'
を使用すると、ガンマではなくアルファとベータのみが返されます。 MySQLは列挙インデックス比較ではなく文字列比較を使用しているようです。
インデックス番号(つまりWHERE status < 4
)を使用できますが、ちょっとしたコード臭(マジックナンバー)であり、新しい値を列挙に挿入すると壊れる場合があります。
解決
メタデータでデータ操作メソッドを使用しようとしていますが、これは厄介なことになります。
これは、ENUM
をルックアップテーブルへの外部キーに置き換える正当な理由です。その後、従来のデータ操作手法を使用できます。
他のヒント
status+0
を使用して、1から始まるENUMのインデックスを返すことができます。
参照 http://serghei.net/docs/database /mysql/doc/E/N/ENUM.html
ちょうど同じ問題に出くわしました。列挙型フィールドを並べ替える場合は、まず文字列型にキャストする必要があります(この例ではカテゴリは列挙型フィールドです):
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");
範囲バージョンを使用する場合は、 FIND_IN_SET("needle", "hay,stack")
を使用してインデックスを返しますが、最初に別のクエリを使用してテーブル定義からENUMリストを抽出する必要があります。
関数を作成します:
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)
がインデックスを取得します。
注意する必要があるのは、ENUM(アイテム間のスペースの有無)と最も内側のREPLACE
(from_string内のスペースの有無)の定義方法だけです。