选择在哪里 - mySQL
Posted
技术标签:
【中文标题】选择在哪里 - mySQL【英文标题】:SELECT WHERE IN - mySQL 【发布时间】:2013-08-05 01:29:49 【问题描述】:假设我有以下表格:
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
有可能吗?
【问题讨论】:
【参考方案1】:这个怎么样?
SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill')
UNION
SELECT null;
【讨论】:
【参考方案2】:这个问题有点令人困惑。 "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”来选择一个,您最好将循环保持在查询之外的值上或使用(ID , Name) 表与数据库中的其他表连接,而不是制作 ID 列表然后使用它。
【讨论】:
【参考方案3】:首先创建您要查找的名称的子查询,然后将子查询左连接到您的表:
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 here。
【讨论】:
以上是关于选择在哪里 - mySQL的主要内容,如果未能解决你的问题,请参考以下文章