1

私はこのクエリを逆にするのが好きです:

SELECT * FROM table WHERE status IN ( option,option1,option2 );

のようなクエリで

SELECT * FROM table WHERE status contains ( 'option' );

フィールド「ステータス」列に含まれる場所 (例):「オプション、オプション 1」。

私が使うとき

SELECT * FROM table WHERE status LIKE '%option%' );

また、「option1」のみを含む「status」列を持つ行も選択します

これは可能ですか?

サンプルデータ:

id,name,status
1,'test1','option,option1'
2,'test2','option,option2'
3,'test3','option2'
4,'test4','option2,option3'
5,'test5','option'

SELECT * FROM table WHERE status contains ( 'option' );

このクエリは、選択レコード 1、2、および 5 を選択する必要があります。

「ステータス」フィールド タイプは varchar です。

問題は、オプションに追加された番号を除いて、ステータス フィールドにほとんど同じようなデータが含まれていることです。もちろん、これは作り話ですが、実際にはこの種のパラメーターがあります。

更新: ガンボの提案の後、ついに見つけました。

私は最初にガンボのリードを試しました(> 0を追加しました):

SELECT * FROM table 
    WHERE FIND_IN_SET('option', status) > 0;

しかし、それもうまくいきませんでした。

いくつかいじった後、原因はステータスフィールドのオプション間のスペースであることがわかりました。これらのレコードは別のソースからインポートされ、コンマの後にスペースが含まれています。

「option,option1」の代わりに「option,option1」

だから私は次のようになりました:

SELECT * FROM table 
    WHERE FIND_IN_SET('option', TRIM(REPLACE(status,' ',''))) > 0;

これは私にとってはうまくいきました。

4

2 に答える 2

10

カンマ区切りの値の場合、FIND_IN_SET関数を使用してその中の値を検索できます。

SELECT * FROM table WHERE FIND_IN_SET('option', status);

式を否定するには、NOTまたは!:を使用します。

SELECT * FROM table WHERE NOT FIND_IN_SET('option', status);
于 2012-06-21T08:43:54.803 に答える
0

クエリで追加のロジックを実行する代わりに、可能であれば、列データのみを修正したい場合があります。

UPDATE `table` SET `status` = REPLACE(`status`, ', ', ',');

次に、次のことができます。

SELECT * FROM table WHERE FIND_IN_SET('option', status);
于 2017-01-11T22:49:22.497 に答える