質問

列挙があります: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

簡単!

関数を作成します:

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内のスペースの有無)の定義方法だけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top