Вопрос

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

Например.Я хотел бы передать два параметра «selectField1» и «selectField2» каждый как логические значения.

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

SELECT

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

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

FROM Table

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

Это было полезно?

Решение

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

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)

Другие советы

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

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

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

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

Вы хотите CASE заявление:

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

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

@selectField1 AS bit
@selectField2 AS bit

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

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

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

IF (selectField1 = true) 
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table

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

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

в избранном

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

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

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top