37

我想创建一个带有参数的存储过程,这些参数指示应该选择哪些字段。

例如,我想将两个参数“selectField1”和“selectField2”分别作为布尔值传递。

然后我想要类似的东西

SELECT

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

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

FROM Table

谢谢卡尔

4

7 回答 7

70

SQL中,您可以这样做:

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

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

相反,如果您对字段值不感兴趣,则只需选择 aNULL并在客户端上解析它。

于 2009-06-24T13:44:11.790 回答
31

你想要CASE声明

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

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

于 2009-06-24T13:44:46.830 回答
14

听起来他们希望能够仅返回允许的字段,这意味着返回的字段数也必须是动态的。这将适用于 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)
于 2009-06-24T13:49:28.503 回答
3
@selectField1 AS bit
@selectField2 AS bit

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

这是你要找的吗?

于 2009-06-24T13:50:56.473 回答
0

这是一种伪方式

IF (selectField1 = true) 
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
于 2009-06-24T13:45:58.513 回答
0

你想要的是:

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

在选择

但是,您不只是不在程序中显示该列吗?

于 2009-06-24T13:47:00.070 回答
-1

这样做的菜鸟方法:

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();
于 2013-05-13T20:58:52.917 回答