Условный SQL-выбор

Я хотел бы создать хранимую процедуру с параметрами, указывающими, какие поля следует выбирать.

Например. Я хотел бы передать два параметра "selectField1" и "selectField2" каждый как bool.

Тогда я хочу что-то вроде

SELECT

if (selectField1 = true) Field1 ELSE do not select Field1

if (selectField2 = true) Field2 ELSE  do not select Field2

FROM Table

Спасибо, Карл.


person Karl    schedule 24.06.2009    source источник


Ответы (7)


Похоже, им нужна возможность возвращать только разрешенные поля, а это означает, что количество возвращаемых полей также должно быть динамическим. Это будет работать с 2 переменными. Что-то большее, чем это, будет сбивать с толку.

IF (selectField1 = true AND selectField2 = true)
BEGIN
   SELECT Field1, Field2
   FROM Table
END
ELSE IF (selectField1 = true)
BEGIN
   SELECT Field1
   FROM Table
END
ELSE IF (selectField2 = true)
BEGIN
   SELECT Field2
   FROM Table
END

Динамический SQL поможет с кратностью. В этом примере предполагается, что по крайней мере 1 столбец верен.

DECLARE @sql varchar(MAX)
SET @sql = 'SELECT '
IF (selectField1 = true)
BEGIN
   SET @sql = @sql + 'Field1, '
END
IF (selectField2 = true)
BEGIN
   SET @sql = @sql + 'Field2, '
END
...
-- DROP ', '
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2)

SET @sql = @sql + ' FROM Table'

EXEC(@sql)
person Justin Balvanz    schedule 24.06.2009
comment
То, что я хочу сделать, на самом деле намного сложнее, чем просто выбрать одно или два поля. У меня есть куча полей, которые мне нужно динамически выбирать, а также выполнять WHERE для определенных полей, например: @whereField1 = 1 @whereField2 = 1 @whereField3 = 0 и т. д., а затем делать WHERE только для Field1 if @whereField1 = 1 и т. д. Мне кажется, что ваш второй пример может быть единственным способом сделать это. Сколько символов в varchar(MAX)? - person Karl; 30.06.2009
comment
SQL 2005 может хранить до 8000 символов. - person Justin Balvanz; 30.06.2009
comment
@Justin varchar(max) в SQL2005 не ограничен 8000 символами. varchar(max) был введен в SQL 2005 как своего рода замена текстового типа данных с поддержкой функций, доступных для varchar. - person kristof; 30.06.2009
comment
Все, что я сделал, это погуглил, и вот что я придумал. Я никогда не достигал макс. - person Justin Balvanz; 01.07.2009
comment
@Justin Balvanz, ваш код выдает мне синтаксическую ошибку, чего-то не хватает в этом, что, как предполагается, есть, и я упускаю это? Спасибо - person Abdullah Khan; 26.07.2010
comment
Статьи Эрланда Соммарскога кажутся здесь уместными. sommarskog.se/dyn-search.html - person mg1075; 05.11.2011

В SQL вы делаете это следующим образом:

SELECT  CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END,
        CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END
FROM    Table

Реляционная модель не предполагает динамического подсчета полей.

Вместо этого, если вас не интересует значение поля, вы просто выбираете NULL и анализируете его на клиенте.

person Quassnoi    schedule 24.06.2009
comment
Это более эффективно и чисто, но что, если NULL является допустимым возможным значением для одного из ваших необязательных полей? Не могли бы вы разобрать имена полей? - person PapillonUK; 12.08.2011

Вам нужен CASE оператор:

SELECT
  CASE 
    WHEN @SelectField1 = 1 THEN Field1
    WHEN @SelectField2 = 1 THEN Field2
    ELSE NULL
  END AS NewField
FROM Table

РЕДАКТИРОВАТЬ: мой пример предназначен для объединения двух полей в одно поле, в зависимости от предоставленных параметров. Это решение один или ни один (не оба). Если вам нужна возможность иметь оба поля на выходе, используйте решение Quassnoi.

person Welbog    schedule 24.06.2009
comment
Я делаю это часто, хотя у SQL есть проблемы с кэшированием операторов, но вы не можете обойти это. - person Kezzer; 24.06.2009
comment
Это может привести к сбою, если столбцы имеют другой тип, например. целое число против символа - person kristof; 30.06.2009
comment
@kristof В этом случае можно использовать convert - person Nikita; 02.07.2019

@selectField1 AS bit
@selectField2 AS bit

SELECT
CASE 
    WHEN @selectField1 THEN Field1
    WHEN @selectField2 THEN Field2
    ELSE someDefaultField
END
FROM Table

Это то, что вы ищете?

person l3a0    schedule 24.06.2009

Это псевдо способ сделать это

IF (selectField1 = true) 
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
person Daniel A. White    schedule 24.06.2009

что вы хотите:

    MY_FIELD=
        case 
            when (selectField1 = 1) then Field1
                                 else Field2        
        end,

в выборе

Однако разве вы не показываете этот столбец в своей программе?

person waqasahmed    schedule 24.06.2009

Нубский способ сделать это:

SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE

Вы можете правильно управлять этой информацией на языке программирования, только используя if-else.

Пример в ASP/JavaScript

// Code to retrieve the ADODB.Recordset
if (rs("field1")) {
   do_the_stuff_a();
}
if (rs("field2")) {
   do_the_stuff_b();
}
rs.MoveNext();
person Domingos    schedule 13.05.2013