Измените WHERE для выбора только в одной строке в зависимости от содержимого поля
Хорошо, это может звучать немного странно, но то, что мне нужно сделать, это просто. У меня есть список компаний, и у каждой есть описание. Сайт на 4 языках. Моя проблема возникает, когда я перечислил компанию на английском языке, но человек, который отвечает за перевод на французский язык, все еще не сделал перевод, поэтому у меня есть простое:
SELECT TOP(6)
company.name,
company.description,
company.address
WHERE
langid=1
ORDER BY
company.id DESC
Реальный запрос является более сложным, но я думаю, что с этим будет легче понять проблему. Что мне нужно сделать, так это, когда описание пусто в langid 2, тогда покажите мне langid 1, так как langid 1 всегда будет первым, который будет добавлен. Я не хочу показывать поле описания пустым.
Представьте, что строка 1, строка 2, строка 3 и строка 5 имеют описание для langid 2, но не для строки 4 и строки 6. Мне нужно показать langid 2 для строк, в которых он содержится, но langid 1 для строк без описания.
Я знаю, что мог бы, вероятно, сделать некоторое время, увеличивая поле @i и вставляя результаты один за другим во временную таблицу, но есть ли лучший способ сделать это?
1 ответ
Это будет работать, если нет lng1.name
и т. д. (т.е. вариант на английском языке / резервный вариант) отсутствует
SELECT TOP(6)
COALESCE(lng2.name, lng1.name) [name],
COALESCE(lng2.description, lng1.description) description,
COALESCE(lng2.address , lng1.address ) address
FROM
company lng1
LEFT JOIN company lng2 ON
lng1.id = lng2.id AND
lng1.langid = 1 AND
lng2.langid = 2 /* your "foreign language" id, e.g. a parameter */
WHERE
lng1.id IN (1,2,3,4,5,6) /* or whatever */
ORDER BY
lng1.id DESC
Он также не заменит полный адрес английской / резервной версией, если отсутствует только часть локализованного варианта. Будут заменены только недостающие части.