13

假设我有下表:

 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

可能吗?

4

3 回答 3

7

这个怎么样?

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill')
   UNION
SELECT null;
于 2013-08-04T03:59:04.050 回答
6

首先创建您要查找的名称的子查询,然后将子查询左连接到您的表:

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 COALESCE(myTable.ID, 0)而不是开始查询SELECT myTable.ID

这里有一个 SQL Fiddle 。

于 2013-08-04T05:01:57.607 回答
1

这个问题有点令人困惑。"IN" 是 SQL 中的有效运算符,它表示与任何值的匹配(请参见此处):

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”来选择一个,您最好将循环保持在查询之外的值上或使用 (ID , Name) 表与数据库中的其他表连接,而不是制作 ID 列表然后使用它。

于 2014-10-07T19:47:52.357 回答