Оператор Sqlite3 CASE в подвыборке - PullRequest
0 голосов
/ 07 ноября 2018

В приложении опроса у меня есть этот рабочий 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 поля вместо сообщения по умолчанию. Но если есть переводы, я их получу! Что не так с запросом?

1 Ответ

0 голосов
/ 07 ноября 2018

Может ли быть так:

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

по какой-то причине не возвращает строк, когда нет перевода, поэтому оператор CASE даже не выполняется, поэтому вы получаете NULL?
Вы должны сделать эту проверку.

...