【问题标题】:Wanting Sqlite SELECT statement to return default values if not existing for keys in a list如果列表中的键不存在,则希望 Sqlite SELECT 语句返回默认值
【发布时间】:2017-03-26 19:32:46
【问题描述】:

我有下表,其中包含 SQLITE 中的示例条目:

CREATE TABLE image (key CHAR(128) NOT NULL PRIMARY KEY, value CHAR(32) NOT NULL); INSERT INTO image VALUES ('key1', 'value1');

我希望能够在单个 SQL 语句中查找键列表 ['key1','key2']。我想要的预期响应如下:

| key        | value         |
|************|***************|
| key1       | value1        |
| key2       | default       |

我环顾四周,但无法弄清楚这一点。我已经尝试了以下

SELECT key, IFNULL(value, 'default') value FROM image WHERE key IN ('key1', 'key2');

以及其他涉及合并等的变体,但这仅返回 key1 的值而不是 key2 的值(我知道这是预期的行为)。

如何编写一条 SELECT 语句来获得上述预期响应?我似乎无法为我的一生弄清楚这一点。提前致谢。

【问题讨论】:

    标签: sqlite select where-clause where-in


    【解决方案1】:

    查询只能返回 FROM 子句中某些表/视图/子查询中实际存在的行;您在 SELECT 表达式列表中所做的任何事情都无法改变这一点。

    因此您必须使用这些值创建一些行(使用子查询或common table expression),然后检查表中是否有匹配的行(使用outer join):

    WITH list(key) AS (
      VALUES ('key1'), ('key2')
    )
    SELECT key,
           IFNULL(value, 'default') AS value
    FROM list
    LEFT JOIN image USING (key);
    

    【讨论】:

    • 效果很好。我实际上从未听说过 SQLite 中的 WITH LIST。今天学到了新东西!
    猜你喜欢
    • 2021-03-31
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2014-06-17
    • 2012-03-22
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多