2017-08-22 9 views
1

私は次のように定義されたSET型の列があるテーブルでMySQL DBを持っている:私はCOLは(「A」に等しいすべての行を返すSELECTクエリを記述したいと思い注文を無視してMySQLでSET列を照会するにはどうすればよいですか?

CREATE TABLE t (
col SET('V','A','L','U','E') 
) 

を、 「L」、「E」) これは、次のクエリを記述することによって行うことができます。

SELECT * FROM t WHERE c = 'A,L,E' 

私が書きたいのクエリは、 'のような入力を命じた以外にも、同じ結果を返します一つですL '、' A '、' E '

私はそうするエレガントな方法を見つけることができなかったと公式ドキュメントで私を助けることができる何かを見つけることができませんでしたあなたは私が知っているドント

SELECT * 
FROM t 
WHERE FIND_IN_SET('A',c)>0 AND FIND_IN_SET('L',c)>0 AND FIND_IN_SET('E',c)>0 

SET

で見つけるを使用する必要が

答えて

1

あなたは以下を使用してナチョの提案を修正することができます:

WHERE floor(pow(2,FIND_IN_SET('A',c)-1))+ 
floor(pow(2,FIND_IN_SET('L',c)-1))+ 
floor(pow(2,FIND_IN_SET('E',c)-1))=c 
これは動作しますが、あなたも試すことができる場合3210

これは決して「優雅な解決策」ではありません...可能であれば、より単純なものを使用したいと思います。

FIND_IN_SETは列挙型の位置を提供するので、この値で2を引いてSET値の内部表現を取得する必要があります。 floor()関数は、find_in_setが0を返すときに式を0に保つために使用されます。

不正なSET値をチェックするときに誤検出のリスクがあることに注意してください( 'A'、 'L' 「E」及び「X」trueを返します)

+0

ありがとうございます、これは私よりも洗練された解決策を探していましたが、 – Eyal

0

SELECT * 
FROM t 
WHERE FIND_IN_SET('A,L,E',c)>0 
+1

最初の提案は、封じ込めの有無を確認します。例えば、私は「V、A、L、E」が含まれていない行を取得します。 – Eyal

+0

2番目の提案は空の結果セットを返しています – Eyal

0

別の可能なアプローチは、(仮定は検索セットが繰り返しがないことである)基の大きさが一致していることを確認+個別に各項目をチェックすることである。

SELECT * 
FROM t 
WHERE FIND_IN_SET('A',c)>0 AND FIND_IN_SET('L',c)>0 AND FIND_IN_SET('E',c)>0 AND BIT_COUNT(c) = 3 
関連する問題