子选择中的Sqlite3 CASE语句

时间:2018-11-07 11:51:24

标签: sqlite subquery case

在民意调查应用程序中,我有以下有效的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字段为空。

(请注意,我无法用经典的join语句替换子查询

为简单起见,只要找不到翻译,我想显示一条'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字段而不是默认消息。但是,如果有翻译,我会得到! 查询出了什么问题?

1 个答案:

答案 0 :(得分:1)

这可能是

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

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