【问题标题】:Sqlite3 CASE statement in a Subselect子选择中的 Sqlite3 CASE 语句
【发布时间】:2018-11-07 11:51:23
【问题描述】:

在投票应用程序中,我有这个有效的 SQL 查询:

SELECT options.id, options.question_id,
CASE WHEN (options.position = 0) THEN 999 ELSE options.position END AS position,
(SELECT translations.text_1 FROM translations WHERE translations.item_model = 'options' AND translations.language = 'fr' AND translations.item_id = options.id) AS translation
    FROM options
WHERE options.question_id IN (1)
ORDER BY options.question_id, position

你看,我选择了属于一个问题的选项,并且为每个选项选择了给定语言的相应翻译 目前,如果没有给定语言的翻译,translation 字段为空。

(请注意,我不能用经典的连接语句替换子查询

为简单起见,我想在找不到翻译时显示'missing translation' 消息。 我认为这个查询会起作用,但事实并非如此:

SELECT options.id, options.question_id, options.is_freetext,
CASE WHEN (options.position = 0) THEN 999 ELSE options.position END AS position,
(SELECT
    CASE WHEN (translations.text_1 IS NULL) THEN
        'missing traslation' -- but I could do another query here to retrieve something else
    ELSE
        translations.text_1
    END
FROM translations WHERE translations.item_id = options.id AND translations.item_model = 'options' AND translations.language = 'fr') AS translation
    FROM options
WHERE options.question_id IN (1)
ORDER BY options.question_id, position

确实,如果没有给定语言的翻译,我会得到null 字段而不是默认消息。但是,如果有翻译,我会得到它们! 查询有什么问题?

【问题讨论】:

    标签: sqlite subquery case


    【解决方案1】:

    会不会是这样的:

    WHERE translations.item_id = options.id AND translations.item_model = 'options' AND translations.language = 'fr'
    

    由于某种原因,当没有翻译时不返回任何行,所以 CASE 语句甚至没有执行,所以你得到 NULL?
    您必须进行此项检查。

    【讨论】:

    • Ops,你是对的:因为我没有该语言的翻译,WHERE 条件不返回任何行,因此 CASE 甚至没有执行......我认为它仍然返回 null 值,如我发布的第一个查询(没有 CASE),但我想不是这样......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多