【问题标题】:Return null rows for non-matched values in IN clause in SQL在 SQL 的 IN 子句中为不匹配的值返回空行
【发布时间】:2015-01-25 20:20:25
【问题描述】:

如果在 IN 子句中找到值,我有一个返回记录的查询。匹配的记录从 0 到 1 不等,因此是查询的结果。但我想将计数设为 5,即使其余行填充为 NULL。有什么办法可以做到这一点? 如,对于给定的查询

SELECT categoryID, categoryName
FROM category
WHERE categoryID
IN ( 52, 58, 60 , 62 , 64) 

我只有前 3 个 id 的值,因此结果只给了我 3 行。但我希望结果计数为 5,其余不满意的行填充空值以进行计数。 当前结果:

CategoryID  CategoryName
52           ABC
58           XYZ
60           DEF

需要的结果

CategoryID  CategoryName
52           ABC
58           XYZ
60           DEF
NULL         NULL
NULL         NULL

【问题讨论】:

  • 这种逻辑的原因是什么?
  • 我不明白你为什么要这样做...?所以如果你输入 IN ( 52, 58, 60 , 62 , 64, 85, 62, 82) 它只会返回更多的空值......?
  • 虽然可以直接在 SQL 中执行此操作,但在大多数情况下,在 SQL 之外执行此操作会容易得多。 @Nightmaresux 的评论指出了另一个好问题:当多次指定同一个 ID 时,您希望发生什么?
  • @hvd 只有 SQL 真的可以吗?
  • 这可能可以使用代码实现,但我想知道我们是否可以直接在普通 SQL 中这样做

标签: mysql sql


【解决方案1】:

将LEFT JOIN 与列出您想要的所有类别ID 的合成表一起使用:

SELECT c.categoryID, c.categoryName
FROM (SELECT 52 AS categoryID
      UNION SELECT 58 UNION SELECT 60 UNION SELECT 62 UNION SELECT 64) AS a
LEFT JOIN category AS c ON a.categoryID = c.categoryID

另一种方法是创建一个包含所有可能的类别 ID 的表。然后使用:

SELECT c.categoryID, c.categoryName
FROM allCategories AS a
LEFT JOIN category AS c ON a.categoryID = c.categoryID
WHERE a.categoryID IN (52, 58, 60 , 62 , 64)

【讨论】:

  • 如果找不到,OP 也希望 categoryID 成为 NULL,所以我认为应该是 c.categoryID 而不是 a.categoryID。
  • @hvd 很好,这是一个很奇怪的要求。
【解决方案2】:

在末尾添加 5 个空行,只选择前 5 行。

SELECT categoryID, categoryName FROM (
SELECT categoryID, categoryName, 1 as ord 
FROM category
WHERE categoryID
IN ( 52, 58, 60 , 62 , 64)
UNION ALL
SELECT NULL as categoryID, NULL as categoryName, 0 as ord 
UNION ALL
SELECT NULL as categoryID, NULL as categoryName, 0 as ord 
UNION ALL
SELECT NULL as categoryID, NULL as categoryName, 0 as ord  
UNION ALL
SELECT NULL as categoryID, NULL as categoryName, 0 as ord  
UNION ALL
SELECT NULL as categoryID, NULL as categoryName, 0 as ord  )t 
ORDER BY ord desc LIMIT 0,5;

【讨论】:

  • UNION 删除重复项,因此这不起作用。不过有创意的答案,它可以与UNION ALL一起使用。
  • 这也处理了ID重复的情况
  • @AakashJain 您得到的结果与 Barmar 的第一种方法相同:两者都不会返回相同的类别两次。 Barmar 的第二种方法可能会,这取决于您填写表格的方式。
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
相关资源
最近更新 更多