web-dev-qa-db-ja.com

SELECT WHERE IN-mySQL

次の表があるとしましょう:

 ID, Name 
 1, John 
 2, Jim 
 3, Steve 
 4, Tom

次のクエリを実行します

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill');

私は次のようなものを得たいです:

ID
1
2
NULL or 0

出来ますか?

11
vshale

探している名前のサブクエリを作成することから始め、サブクエリをテーブルに結合したままにします。

_SELECT myTable.ID
FROM (
  SELECT 'John' AS Name
  UNION SELECT 'Jim'
  UNION SELECT 'Bill'
) NameList
LEFT JOIN myTable ON NameList.Name = myTable.Name
_

これは、見つからない名前ごとにnullを返します。代わりにゼロを返すには、_SELECT myTable.ID_の代わりにSELECT COALESCE(myTable.ID, 0)でクエリを開始します。

SQL Fiddle here があります。

5
Ed Gibbs

これはどう?

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill')
   UNION
SELECT null;
4
ChaiNavawongse

質問は少しわかりにくいです。 「IN」はSQLで有効な演算子であり、任意の値との一致を意味します( here を参照)。

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill');

次と同じです:

SELECT Id FROM Table WHERE NAME = 'John' OR NAME = 'Jim' OR NAME = 'Bill';

あなたの答えでは、あなたは順番に各値の返信が欲しいようです。これは、結果をUNION ALLに結合することで実現されます(UNIONのみが重複を排除し、順序を変更できます)。

SELECT max(Id) FROM Table WHERE NAME = 'John' UNION ALL
SELECT max(Id) FROM Table WHERE NAME = 'Jim' UNION ALL
SELECT max(Id) FROM Table WHERE NAME = 'Bill';

上記は、一致する場合は1 Id(最大)を返し、一致しない場合はNULLを返します(Billなど)。一般に、リスト内の名前のいくつかに一致する複数の行を持つことができることに注意してください。私は「max」を使用して1つを選択します。 、Name)テーブルのIDのリストを作成してから使用する代わりに、データベース内の他のテーブルと結合します。

1
marco