选择在哪里 - 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的主要内容,如果未能解决你的问题,请参考以下文章

navicat 备份数据库放在哪里

如何在mysql中选择前三行

在选择框中显示 Mysql 表字段值

请问mysql-connector-java-5.1.7-bin.jar怎么安装,安装到哪里,谢谢!

在mysql服务器中选择查询语法问题[重复]

Mysql中的数组在哪里?