Как я могу написать запрос, который возвращает два разных столбца для двух разных условий?

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