对于非常基本的查询
SELECT id, column1, column2
FROM table1
WHERE id IN ("id1", "id2", "id3")
其中 where 语句中的参数作为变量传递,我还需要为 id 不存在的行返回值。一般来说,这是一个非常相似的问题,如下所述:SQL:如何返回不存在的行? https://stackoverflow.com/questions/5925338/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 查询来做到这一点?
Edit:事实上,上述情况是假设的情况。 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
。我在此虚拟机上仅配置了 2.0GB RAM。
对于这个解决方案的工作来说,有多少个未知的 id 并不重要。只需将它们全部放入派生表中即可。通过使用LEFT OUTER JOIN
,它会自动查找 table1 中存在的条目,对于缺少的条目,派生表中的条目将与 NULL 进行匹配。
The 合并() http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_coalesce函数返回其第一个非空参数,因此它将使用匹配行中的列(如果存在)。如果没有找到,它将默认为派生表中的列。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)