2016-09-12 1 views
0

すべてのユーザーのユーザー名を含む列のうち、ユーザーのユーザー名と一致する必要があるSQLクエリに問題があります。SQL double pipe concatenationと似ています

だから、コラムのようなものが含まれます:ユーザー

|USER1|USER2|USER3|USER11|USER22| 

も、「USER11」に一致する「USER1」を防ぐために、左右にパイプを持っています。

私のクエリは(コードは、MySQLで実行されるクエリでUSER1は、私たちのコードから生成された変数であることを私は連結構文を保持しなければならないと私はあまりにも標準構文を使用する必要があります

SELECT * FROM myTable WHERE CONCATUSERS LIKE ('%|' || 'USER1' || '|%') 

注意です、SQLServerのなど。

だからLIKE句で文字列を連結する正しい方法は何ですか?MySQLは連結のための二重のパイプを使用しています

+1

MySQLとSQL Serverは、文字列の連結のためのさまざまな演算子を持っている - 特にあなたが探している1? –

+0

私は両者で動作するものを使用しなければならず、二重パイプが標準のものでなければならないことがわかりました –

+1

残念ながら、SQL標準であるにもかかわらず、SQL Serverではサポートされていません。 MySQLではサポートされていますが、明示的に有効にする必要があります。 SQL 2012以降はCONCATをサポートしているので、そのバージョンに制約を付けることができれば、両方をサポートできるようになります。 –

答えて

0

CONCATを使用してください。 (SQLサーバー2012以降で使用可能)

これは、型を暗黙的に変換して値を文字列に追加するという利点があります。そしてそれはSql ServerとMySqlだけではありません。

SELECT * FROM myTable WHERE CONCATUSERS LIKE CONCAT('%|','USER1','|%'); 

MySQLでは、連結された値の1つがNULLの場合、結果はNULLになることに注意してください。しかし、SQL Server上ではありません。

これは、その機能に2つの値を許可するだけで頑固なことです。
ので、SQLは、MySQL、最近のSql ServerとOracle上でそのまま実行する必要がある場合、これは動作するはずです:

SELECT * FROM myTable WHERE CONCATUSERS LIKE CONCAT(CONCAT('%|','USER1'),'|%'); 
+0

'CONCAT'はSQL Server 2012以降でのみサポートされています。 –

+0

コメントありがとうございます。注目される。ええ、タグがバージョン特有でないときは常にそのような情報を加えるべきです。 – LukStorms

1

。あなたは+を使用することができますSQL Serverの。

SELECT * 
FROM myTable 
WHERE CONCATUSERS LIKE ('%' + '|user1|' + '%') 
+0

問題は2つの異なるものではなく標準の構文を使うべきです。 –

0

あなたはCONCAT関数で行くことができます。それは両方のSQLでサポートされていたよう とMySQL

SELECT * 
FROM xpat 
WHERE plname LIKE concat('%' ,'|user1|' ,'%'); 
+1

'CONCAT'はSQL Server 2012以降でのみサポートされています。 –

+0

user1は変数ですが、これは機能しません。これがうまくいけば、文字定数 ''%| user1 |%''が動作します。 – Hogan

関連する問題