在case语句中使用变量语句中的变量

时间:2014-03-25 11:28:47

标签: sql sql-server

我试图在select语句中使用变量(SQL Server 2008),我遇到了一些困难。我在下面提供了我的代码。

DECLARE @newFieldName nvarchar(30)

SET @newFieldName = 'Variable 1'

SELECT 

SUM(CASE WHEN @newFieldName IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default",

SUM(CASE WHEN @newFieldName NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default"

FROM table 1

我没有得到正确的结果。但是,当我使用下面的内容时,我会这样做。

SELECT 

SUM(CASE WHEN [Variable 1] IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default",

SUM(CASE WHEN [Variable 1] NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default"

FROM [table 1]

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:3)

你的问题是什么?表达式:

'Variable 1' IN ('x', 'y' ,'z')

总是会返回FALSE,因为您没有在接受的值列表中包含字符串'Variable 1'

表达式:

[Variable 1] IN ('x', 'y' ,'z')
当变量包含这三个值中的一个时,

将返回TRUE。

常量字符串和列的名称是两个非常不同的东西。如果您想拥有可以使用变量更改列名称的代码,则需要了解动态SQL和sp_executesql

编辑:

您正在执行的动态SQL版本是:

declare @sql nvarchar(max);
declare @newFieldName nvarchar(30);
set @newFieldName = 'Variable 1';

set @sql = '
SELECT SUM(CASE WHEN @newFieldName IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Default",
       SUM(CASE WHEN @newFieldName NOT IN ('x', 'y' ,'z') then 1 ELSE 0 END) as "Not Default"
FROM table 1';

set @sql = replace(@sql, '@newFieldName', '['+@newFieldName+']');

exec sp_executesql @sql;

但是,您应该首先阅读sp_executesql(here)上的文档并了解动态SQL。

答案 1 :(得分:0)

你的@newFieldName只是一个字符串:它不会"冒充"表格中的实际栏目......

我认为既然你可能只有一些你感兴趣的列,你可以做类似的事情

DECLARE @newFieldName nvarchar(30)

SET @newFieldName = 'Variable 1'

SELECT
SUM(CASE WHEN @newFieldName = 'Variable 1' and [Variable 1] IN ('x', 'y' ,'z') then 1
         WHEN @newFieldName = 'Variable 2' and [Variable 2] IN ('x', 'y' ,'z') then 1 ELSE 0
    END) as [Default],
SUM(CASE WHEN @newFieldName = 'Variable 1' and [Variable 1] NOT IN ('x', 'y' ,'z') then 1
     WHEN @newFieldName = 'Variable 2' and [Variable 2] NOT IN ('x', 'y' ,'z') then 1 ELSE 0
END) as [Not Default],

FROM table 1   

这样你可以避免使用动态sql,但是当然会有更多列可能性来快速变得丑陋