【问题标题】:SQL conditional SELECTSQL 条件选择
【发布时间】:2010-11-05 12:33:46
【问题描述】:

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

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

然后我想要类似的东西

SELECT

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

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

FROM Table

谢谢 卡尔

【问题讨论】:

    标签: sql select conditional


    【解决方案1】:

    SQL,你这样做:

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

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

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

    【讨论】:

    • 这更高效、更简洁,但是如果 NULL 是您的可选字段之一的有效可能值怎么办?你会解析字段名吗?
    【解决方案2】:

    你想要CASE statement:

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

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

    【讨论】:

    • 我经常这样做,虽然 SQL 在缓存语句时遇到了麻烦,但你无法真正绕过它。
    • 如果列的类型不同,则可能会失败,例如int vs char
    • @kristof 在这种情况下可以使用convert
    【解决方案3】:

    这是一种伪方式

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

    【讨论】:

      【解决方案4】:

      你想要的是:

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

      在选择中

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我想要做的实际上比仅仅选择选择一两个字段要复杂得多。我有一堆我需要能够动态选择的字段,以及在某些字段上执行 WHERE,例如:@whereField1 = 1 @whereField2 = 1 @whereField3 = 0 等,然后只在 Field1 上执行 WHERE if @whereField1 = 1 等。在我看来,您的第二个示例可能是真正做到这一点的唯一方法。 varchar(MAX) 有多少个字符?
        • SQL 2005 最多可以存储 8000 个字符。
        • SQL2005 中的 @Justin varchar(max) 不限于 8000 个字符。 varchar(max) 是在 SQL 2005 中引入的,作为文本数据类型的某种替换,支持 varchar 可用的函数。
        • 我所做的只是用谷歌搜索它,这就是我想出的。我从来没有达到最大值。
        • @Justin Balvanz,您的代码给了我一个语法错误,是否缺少某些内容,可以理解为存在并且我错过了?,谢谢
        【解决方案6】:
        @selectField1 AS bit
        @selectField2 AS bit
        
        SELECT
        CASE 
            WHEN @selectField1 THEN Field1
            WHEN @selectField2 THEN Field2
            ELSE someDefaultField
        END
        FROM Table
        

        这就是你要找的吗?

        【讨论】:

          【解决方案7】:

          这样做的菜鸟方式:

          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();
          

          【讨论】:

            猜你喜欢
            • 2017-03-30
            • 2018-03-08
            • 1970-01-01
            • 2021-09-11
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-04
            相关资源
            最近更新 更多