SQL条件SELECT

Kar*_*arl 32 sql select conditional

我想创建一个存储过程,其中包含指示应选择哪些字段的参数.

例如,我想将两个参数"selectField1"和"selectField2"分别作为bools传递.

然后我想要类似的东西

SELECT

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

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

FROM Table
Run Code Online (Sandbox Code Playgroud)

谢谢卡尔

Qua*_*noi 59

SQL,你这样做:

SELECT  CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END,
        CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END
FROM    Table
Run Code Online (Sandbox Code Playgroud)

关系模型并不意味着动态字段计数.

相反,如果您对字段值不感兴趣,只需选择一个NULL并在客户端上解析它.


Wel*_*bog 22

你想要的CASE声明:

SELECT
  CASE 
    WHEN @SelectField1 = 1 THEN Field1
    WHEN @SelectField2 = 1 THEN Field2
    ELSE NULL
  END AS NewField
FROM Table
Run Code Online (Sandbox Code Playgroud)

编辑:我的例子是将两个字段组合成一个字段,具体取决于提供的参数.这是一个或两个解决方案(不是两者).如果您希望在输出中同时包含两个字段,请使用Quassnoi的解决方案.


Jus*_*anz 10

听起来他们希望能够只返回允许的字段,这意味着返回的字段数也必须是动态的.这将适用于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
Run Code Online (Sandbox Code Playgroud)

动态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)
Run Code Online (Sandbox Code Playgroud)