假设我有下表:
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
可能吗?
这个怎么样?
SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill')
UNION
SELECT null;
首先创建您要查找的名称的子查询,然后将子查询左连接到您的表:
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 。
这个问题有点令人困惑。"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 列表然后使用它。