SQL 条件选择

Posted

技术标签:

【中文标题】SQL 条件选择【英文标题】:SQL conditional SELECT 【发布时间】: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

谢谢 卡尔

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于SQL 条件选择的主要内容,如果未能解决你的问题,请参考以下文章

选择查询中的 SQL 条件变量

SQL - 如何选择具有特定条件的行?

SQL 条件选择

SQL 查看条件选择

sql Kentico多项选择条件

SQL - 仅在条件匹配时选择 [关闭]