【问题标题】:SELECT WHERE IN - mySQL选择在哪里 - 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

有可能吗?

【问题讨论】:

    标签: mysql select where


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-19
          • 2021-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-24
          • 1970-01-01
          相关资源
          最近更新 更多