#sql-server #tsql #conditional-statements #multiple-conditions
#sql-server #tsql #условные операторы #множественные условия
Вопрос:
У меня есть таблица Microsoft SQL Server, в которой есть три столбца — один для местоположений, один для связанных изображений и один, указывающий, предназначено ли данное изображение для использования в качестве основного изображения для данного местоположения (это сделано потому, что исторически для каждого местоположения было загружено несколько изображений, и этот столбец указывал, какое изображение является тем, которое фактически используется).
Теперь мы хотим иметь возможность выбирать и назначать второе изображение в качестве логотипа для наших местоположений, в результате чего будет добавлен четвертый столбец, чтобы указать, какое изображение становится этим логотипом.
Итак, у меня есть таблица, которая выглядит примерно так:
---------- ---------- ----------------- -----------
| filename | location | IsMainImage | IsLogo |
---------- ---------- ----------------- -----------
| img1 | 10 | True | Null |
| img2 | 10 | Null | True |
| img3 | 10 | Null | Null |
| img4 | 20 | True | Null |
| img5 | 20 | NULL | True |
---------- ---------- ----------------- -----------
Моя цель — написать запрос, который вернул бы img1 и img2 как разные столбцы в одной строке моего запроса, за которыми следуют img3 и img4 в другой строке. Из приведенной выше таблицы мне нужно, чтобы результат выглядел следующим образом:
----------- -------------
| filename1 | filename2 |
----------- -------------
| img1 | img2 |
| img4 | img5 |
----------- -------------
Пожалуйста, обратите внимание, что мое описание является чрезмерным упрощением. Я изменяю пакет SSIS, который используется другим процессом, который я не могу изменить. Это причина, по которой мне нужен вывод в этом формате.
То, что стало Filename1 и Filename2, раньше было одним и тем же файлом (логотип был измененной версией основного изображения), и теперь мне нужно различать их.
Крайне важно, чтобы только столбцы, помеченные как IsMainImage, отображались под filename1, и только столбцы, помеченные как IsLogo, отображались под filename2.
Я был бы признателен за любую помощь в этом. Спасибо!
Ответ №1:
Использование выражения Case:
SELECT max(CASE WHEN [IsMainImage] = 'True' then filename end) as filename1,
max(CASE WHEN [IsLogo] = 'True' then filename end) as filename2
from Table_testcase group by location;
Комментарии:
1. Спасибо за ответ! Я скоро попробую это и дам вам знать.
2.В стороне: это
case
выражение, а не оператор.3. Не понимаю. Не могли бы вы отредактировать свой ответ и вставить запрос, который вызывает проблему?
4. Это работает в том, что касается ответа на мой вопрос, и я пометил его как ответ. Спасибо! Неожиданная проблема, с которой я столкнулся, заключается в возможности использовать это как подзапрос, поскольку это приводит к тому, что «В списке выбора может быть указано только одно выражение, когда подзапрос не вводится с помощью EXISTS».
5. Мохд Атиф, прежде всего, моя искренняя благодарность. Вы действительно ответили на мой вопрос. То, с чем я имею дело, является результатом того, что он является частью большего запроса. Я попытаюсь включить это как часть моего вопроса — возможно, как комментарий, как только я выясню, как его представить.
Ответ №2:
Вы можете объединить таблицу с самой собой, что-то вроде этого:
SELECT im1.filename as filename1,im2.filename as filename2
FROM images im1
JOIN images im2
ON im1.location = im2.location
AND im2.IsLogo = 1
WHERE im1.IsMainImage = 1
Комментарии:
1. Спасибо! Это близко, однако оно возвращает только строки для местоположений, в которых установлены оба изображения. Все другие местоположения игнорируются, что может стать проблемой. Я понимаю, что это не сразу понятно из моего описания.