0

如何使用 " IN" 语句设置默认值,如下所示:

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

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

John33
0
amanda1
erik
4

2 回答 2

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不能将新行“添加”到结果集中。

于 2014-09-27T17:53:09.973 回答
2

比较为它评估的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,则查询将返回该行以及 fromnNULL所有列的值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 
于 2014-09-27T18:00:50.857 回答