SQL:我想要一行返回NULL,即使我的IN子句没有匹配

时间:2015-01-31 02:04:32

标签: sql mybatis ibatis

即使我的IN子句中没有行匹配,我希望我的SQL查询返回一行。

例如,这个查询:

SELECT id, foo 
FROM table 
WHERE id IN (0, 1, 2, 3)

将返回:

id|foo
 0|bar
 1|bar
 2|bar
 3|null

但我有(因为没有id为3的行):

id|foo
 0|bar
 1|bar
 2|bar

我能找到这个伎俩:

SELECT tmpTable.id, table.bar
FROM (
    SELECT 0 as id
    UNION SELECT 1
    UNION SELECT 2
    UNION SELECT 3
) tmpTable
LEFT JOIN
( 
SELECT table.foo, table.id 
    FROM table 
    WHERE table.id IN (0, 1, 2, 3)
) table
on table.id = tmpTable.id

有更好的方法吗?

奖励:如何使用myBatis的列表变量?

3 个答案:

答案 0 :(得分:3)

超负荷是对的。大多数SQL开发人员使用存储整数的辅助表(以及存储日期的辅助表)。这一点在Joe Celko" SQL for Smarties"的完整章节中进行了概述。

示例:

CREATE TABLE numeri ( numero INTEGER PRIMARY KEY )

DECLARE @x INTEGER
SET @x = 0
WHILE @x < 1000
BEGIN
  INSERT INTO numeri ( numero ) VALUES ( @x )
  SET @x = @x + 1
END

SELECT
  numero AS id,
  foo
FROM
  numeri
  LEFT OUTER JOIN my_table
    ON my_table.id = numero
WHERE
  numero BETWEEN 0 AND 3

答案 1 :(得分:-1)

编程最小代码高性能的主要目标不需要这个东西只是从子句

中删除id 3

答案 2 :(得分:-1)

如何说:

SELECT id,foo 从表 WHERE id&gt; = 0 AND&lt; = 3