mysql - 为不存在的行返回默认值

标签 mysql sql

对于最基本的查询

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/

相关文章:

php - 用html向mysql添加新元素

mysql - 如何干净地重新安装 zoneminder?

mysql - SQL 选择跨多个列的类别计数

mysql - 选择更多列

MYSQL求和所有用户对单个用户购买商品的总票数

mysql - 为什么我无法插入范围列分区

php - 如何找到每个页面的所有标签,然后将标签拼接成一列?

sql - Oracle 查询列出内存中的时间

sql - 我可以将一行一列的子查询视为标量吗?

mysql - 向表中插入数据时出现 SQL 错误