我试图在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]
非常感谢任何帮助。感谢。
答案 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,但是当然会有更多列可能性来快速变得丑陋