【问题标题】:Select where field in values (if field in value not exist return as null)选择值中的字段(如果值中的字段不存在则返回为空)
【发布时间】:2015-05-12 02:58:18
【问题描述】:

我想在 where 子句中选择一个数据。假设我有 $values: 1,2,3,4

然后我想从该值的表中选择行。

  SELECT `date` from another_table where id in (1,2,3,4)

如果another_table只有id为1,2和3的行,则表示id为4的行不存在。我希望仍然选择 4 的 id 并返回 null 或 nol 或 NEVER。

      another_table
     -------+-------------+
     |  id  |  date       |
     ----------------------    
         1     Yesterday
         2      Today
         3      Tomorow
         5      Today

预期的结果是

     -------+-------------+
     |  id  |  date       |
     ----------------------    
         1     Yesterday
         2      Today
         3      Tomorow
         4      Never

如何做到这一点?

提前致谢

【问题讨论】:

  • 理解你的问题可能比回答它更难。你能举例说明你想从another_table得到什么结果吗?
  • 数字能走多远?为此,您需要另一个包含所有数字的表格或动态视图
  • 1000000 或更多数字
  • 通常,数据显示问题(与数据存储和检索相反)最好在应用程序级代码中处理(例如一点 PHP)
  • @strawberry,这不是关于数据显示的问题,而是关于如何从数据库中获取数据的棘手方法。我最终采用这种方法的原因很长。

标签: mysql sql


【解决方案1】:

作为一种选择,使用内联视图作为行源,并执行外连接操作。我们可以使用 IF 表达式来检查是否从 another_table 返回了匹配的行,我们知道如果有匹配的行,id 的值不会为 NULL,连接谓词(在 ON 子句中)向我们保证了这一点。 )

举个例子:

SELECT n.id
     , IF(a.id IS NULL,'Never',a.date) AS `date`
  FROM ( SELECT 1 AS id
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
       ) n
  LEFT
  JOIN another_table a
    ON a.id = n.id
 ORDER BY n.id

内联视图查询被执行,结果被物化到一个临时表中(MySQL 称之为派生表)。当外部查询运行时,n 实际上是一个包含 4 行的表。

显然,如果id 值列表必须更改,您需要更改视图定义。内联视图的 SQL 文本可以从数组中的编程语言中的数组动态生成。

对于大量的值,内联视图变得笨拙,并且您会从表而不是视图中获得更好的性能。

【讨论】:

  • 正要发布相同的答案 - 当然这需要根据可能的ids范围进行更改
  • 首先,感谢您的回答。但是如果我有百万个数字,我应该写UNION ALL SELECT百万次吗?
  • @iyal:内联视图只是一种方法。但关键是,要将这些值 (1,2,3,4) 作为结果集中的列值返回,您需要某种行源来提供这些值。我演示的示例内联视图模式是我们(有效)创建临时表并在查询中填充它的一种便捷方式。您还可以单独执行 CREATE TEMPORARY TABLE n (id INT);INSERT INTO n (id) VALUES (1),(2),(3),(4);,然后在查询中将 n 引用为表。 ... FROM n LEFT JOIN ....
  • 谢谢,我会试一试(创建临时表并从中左连接)
  • 如果我有数百万个数字范围并在临时表中插入数百万次,查询将如此缓慢wwwwww。 ?????
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多