Как вернуть столбцы условно в запросе SQL Server? - PullRequest
0 голосов
/ 27 ноября 2018

Скажем, у меня есть столбцы is_return_foo, is_return_bar и is_return_baz.

Мне нужно вернуть столбцы foo, bar, baz, если для любого из вышеперечисленных соответственно установлено значение true ...

Является ли CASE WHEN лучшим вариантом?

Что-то вроде:

SELECT
    CASE is_return_foo WHEN true THEN foo ELSE null
    CASE is_return_bar WHEN true THEN bar ELSE null
    CASE is_return_baz WHEN true THEN baz ELSE null
    another_column
FROM 
    my_table

Обновление

В основном я хочу вернуть столбцына основе флагов включения / выключения.Таким образом, если флаг A включен, то вернуть значение столбца A, если флаг B включен, тогда вернуть значение столбца B.

Возможно, мы могли бы сказать, основываясь на разрешениях, но более детально.

Так сказатьу вас есть электронное сообщение с телом, заголовками, телами, временем чтения, чтением и временем чтения.

Таким образом, обычный пользователь будет видеть только тело, от имени, а премиум-клиент может быть настроен также на чтение заголовков, чтение ивремя чтения.

Но я бы хотел делать ot для каждого столбца вместо группы столбцов.

Если бы это была группа столбцов, то мы могли бы легко сказать СЛУЧАЙ, КОГДА ЗАДНЕГО ТОГО, ЧЕМ заголовки, читать, читатьвремя.

Обновление 2

Я думаю, что мы можем делать «разрешения» на основе групп, поэтому если вы являетесь серебряным участником, вы видите только некоторые поля, но если вы являетесь золотымчлен вы видите все поля.

Ответы [ 3 ]

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

Оператор CASE - единственный известный мне способ выполнить то, что вы пытаетесь сделать в своем вопросе ... по крайней мере, если бы не было множества условий IF / ELSE, которые дублировали бы код для вашего базового оператора выбора (сделал бы для кошмара управления).Возможно, вам будут предложены лучшие решения, если мы поймем больше о том, что это за поля и почему существует этот сценарий.Моя интуиция говорит мне, что это было бы лучше в качестве отдельных запросов, но трудно сказать, основываясь на примерах типа "foo" и "bar".

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

Динамические таблицы TSQL и сводные таблицы работают для этого варианта использования.

DECLARE @Columns nvarchar(max);
DECLARE @Sql     nvarchar(max);

SELECT @Columns = CONCAT('[', Column, ']') FROM Permissions

SET @Sql = '
  SELECT pvt.*
  FROM Data AS d
  PIVOT (MIN(ColumnValue) FOR ColumnName IN (' + @Columns +')) AS pvt'

EXEC sp_executesql @Sql;

sp_executesql Ссылка

Pivot Ссылка

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

Может быть, что-то вроде этого - решение, которое вы ищете:

SELECT
    your columns here
FROM my_table
where COALESCE(is_return_foo,is_return_bar,is_return_baz) is not null
...