如何使用" IN
"设置默认值声明,像这样:
SELECT username
FROM user
WHERE id IN (1,2,3,4)
ORDER BY FIELD(id,1,2,3,4)
如果id = 2
不可用,请返回0
或null
,如下所示:
John33
0
amanda1
erik
答案 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