使用""设置默认值声明?

时间:2014-09-27 17:27:48

标签: mysql sql sql-in

如何使用" IN"设置默认值声明,像这样:

SELECT username
FROM user
WHERE id IN (1,2,3,4)
ORDER BY FIELD(id,1,2,3,4)

如果id = 2不可用,请返回0null,如下所示:

John33
0
amanda1
erik

2 个答案:

答案 0 :(得分:2)

您需要使用left join

执行此操作
SELECT u.username
FROM (select 1 as id union all select 2 union all select 3 union all select 4
     ) ids left join
     user u
     on u.id = ids.id
ORDER BY FIELD(id, 1, 2, 3, 4);

where子句中的逻辑无法向结果集“添加”新行。

答案 1 :(得分:2)

IN (list)比较为其评估的每一行返回一个布尔值,(TRUE,FALSE或NULL)。

因此,foo IN (list)不能(自己)“生成”行行中不可用的行。

(你说id = 2“不可用”,我们认为这意味着user中没有满足该谓词的行。)

您可以生成如图所示的结果集,但它根本不需要进行IN比较。

您需要一个行源,保证返回您想要的“id”值;内联视图是一种方便的方法。

SELECT u.username
  FROM ( SELECT 1 AS id
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
       ) n
  LEFT
  JOIN user u 
    ON u.id = n.id
 ORDER BY n.id

LEFT JOIN指定外连接操作。也就是说,如果右侧的表(user)中没有匹配左侧表格中的行(n)的匹配行,则查询将返回该行的行来自n的所有列的NULL以及user值。

您可以使用SELECT列表中的表达式替换用户名替换的NULL值。检查u.id是否为NULL(这意味着找不到匹配的行),并返回其他内容。例如,文字0

SELECT IF(u.id IS NULL,'0',u.username) AS username

这是ANSI标准等效的MySQL特定语法

SELECT CASE WHEN u.id IS NULL THEN '0' ELSE u.username END AS username

如果要替换username的所有NULL值,不只是在缺少user行时产生的NULL值:

SELECT IFNULL(u.username,'0') AS username