如何使用 " IN
" 语句设置默认值,如下所示:
SELECT username
FROM user
WHERE id IN (1,2,3,4)
ORDER BY FIELD(id,1,2,3,4)
如果id = 2
不可用,则返回0
or null
,如下所示:
John33
0
amanda1
erik
你需要这样做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
不能将新行“添加”到结果集中。
比较为它评估的IN (list)
每一行返回一个布尔值(TRUE、FALSE 或 NULL)。
因此, afoo 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
,则查询将返回该行以及 fromn
中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
如果要替换 的所有 NULL 值username
,而不仅仅是user
缺少行时产生的 NULL 值:
SELECT IFNULL(u.username,'0') AS username