Subselect中的Sqlite3 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字段为空。

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

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

可能是这个吗:

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

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

最新更新