对于最基本的查询
SELECT id, column1, column2
FROM table1
WHERE id IN ("id1", "id2", "id3")
其中 where 语句中的参数作为变量传递,我还需要为不存在 id 的行返回值。一般来说,这是一个与此处概述的问题非常相似的问题:SQL: How to return an non-existing row?但是WHERE语句中有多个参数
id2 不存在时的结果:
-------------------------------
| id | column1 | column2 |
-------------------------------
| id1 | some text | some text |
| id3 | some text | some text |
-------------------------------
id2 不存在时的期望结果
-----------------------------------
| id | column1 | column2 |
-----------------------------------
| id1 | some text | some text |
| id2 | placeholder | placeholder |
| id3 | some text | some text |
-----------------------------------
我的第一个想法是创建一个临时表并将其加入查询。不幸的是,我无权创建任何类型的临时表,因此我只能使用 SELECT 语句。
有没有办法在 SQL SELECT 查询中做到这一点?
编辑: 事实上,上述是一种假设情况。在 WHERE 子句中可以是数百个 ID,其中丢失的数量未知。
最佳答案
你可以做一个派生表来创建类似临时表的东西,但它只能用于这个查询:
SELECT t.id, COALESCE(t.column1, _dflt.column1) AS column1
FROM (
SELECT 'id1' AS id, 'placeholder text 1' as column1
UNION ALL
SELECT 'id2', 'placeholder text 3'
UNION ALL
SELECT 'id3', 'placeholder text 3'
) AS _dflt
LEFT OUTER JOIN table1 t USING (id);
回复评论:
我刚刚在 MySQL 5.6.15 上测试了上面的方法,看看我可以通过一系列 UNION ALL 获得多少个不同的 SELECT,每个 SELECT 一行。
我得到的派生表返回 5332 行,但我认为如果我有更多 RAM,我可以返回更多行。
如果我再尝试一个 UNION ALL,我会得到:ERROR 1064 (42000): memory exhausted near '' at line 10665
。我在此 VM 上只配置了 2.0GB 的 RAM。
对于此解决方案来说,有多少未知 ID 并不重要。只需将它们全部放在派生表中即可。通过使用 LEFT OUTER JOIN
,它会自动查找 table1 中存在的那些,对于缺少的那些,派生表中的条目将与 NULL 匹配。
COALESCE()函数返回它的第一个非空参数,因此它将使用匹配行中的列(如果存在)。如果找不到,它将默认为派生表中的列。
关于mysql - 为不存在的行返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22117442/