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 条件选择的主要内容,如果未能解决你的问题,请参考以下文章