2017-12-08 13 views
2

ように私はLIKEが私のテーブルには、col1, col2, col3列がありhere.は、複数のORを組み合わせるとMySQL

から内部IN句で使用することができないことを理解しています。

LIKE演算子を使用して複数の列に複数の値を見つける方法を教えてください。 は、現在、私のクエリは次のとおりです。

SELECT col1, col2, col3 
FROM table_name 
WHERE 
( 
    Col1 = '38' 
    OR Col1 LIKE '%,38' 
    OR Col1 LIKE '%,38,%' 
    OR Col1 LIKE '38,%' 
) 
OR 
(
    col2 = '38' 
    OR col2 LIKE '%,38' 
    OR col2 LIKE '%,38,%' 
    OR col2 LIKE '38,%' 
) 
OR 
(
    col3 = '38' 
    OR col3 LIKE '%,38' 
    OR col3 LIKE '%,38,%' 
    OR col3 LIKE '38,%' 
) 

は方法がより速く/それが賢く/短くありませんか?ありがとうございます!

+0

はいだろう。データを訂正し、複数の値を同じ列に格納しないようにしてください。そうすれば、カンマ区切りの値から構文解析する必要がなくなります。第一にテーブルを適切に定義する時間を費やさないという愚かな決断の問題は、必要なときにデータを取得するのが100倍になるということです。それから、WHERE(col1 = '38' or col2 = '38' or col3 = '38') 'になります。 –

+0

私はあなたに同意する、テーブルは正規化する必要があります。しかし、今のところ、私はこのレガシーフォーマットにとどまっていなければなりません。 –

答えて

3

FIND_IN_SET()関数を使用できます。 MySQLには、値がカンマで区切られた値を含む文字列内にある場合、フィールドインデックスを返す専用の関数FIND_IN_SET()があります。

DROP TABLE table_name; 

CREATE TABLE table_name 
(col1 VARCHAR(100)); 

INSERT INTO table_name VALUES ('38'); 
INSERT INTO table_name VALUES ('37,38,39'); 
INSERT INTO table_name VALUES ('37,38'); 
INSERT INTO table_name VALUES ('38,39'); 
INSERT INTO table_name VALUES ('48'); 


SELECT col1 
FROM table_name 
WHERE FIND_IN_SET(38, col1) > 0; 

あなたのソリューションは、

SELECT col1, col2, col3 
FROM table_name 
WHERE FIND_IN_SET(38, col1) > 0 
    OR FIND_IN_SET(38, col2) > 0 
    OR FIND_IN_SET(38, col3) > 0 ; 
関連する問題