Измените 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

Он также не заменит полный адрес английской / резервной версией, если отсутствует только часть локализованного варианта. Будут заменены только недостающие части.

Другие вопросы по тегам