2014-03-25 3 views
0

select 문 (SQL Server 2008)에서 변수를 사용하려고하는데 어려움이 있습니다. 나는 아래에 나의 코드를 포함시켰다.select 문 내에서 case 문에서 변수 사용

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] 

어떤 도움을 주시면 감사하겠습니다. 감사.

답변

3

무엇이 당신의 질문입니다. 표현 :

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

은 항상 당신이 허용되는 값의 목록에있는 문자열 'Variable 1'을 포함하지 않았기 때문에 FALSE를 반환 할 것입니다.

식 : 가변 이러한 세 가지 값 중 하나가 포함 된 경우

[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', '['[email protected]+']'); 

exec sp_executesql @sql; 

그러나 sp_executesql을에 대한 설명서 (here)를 읽고 동적 SQL에 대한 학습에 의해 시작해야합니다.

+0

감사 @Gordon Linoff 빠르게 추한 것입니다. 내 질문은 그렇다면 어떻게 [변수 1]을 선언하기 위해 DECLARE/SET을 사용할 수 있습니까? 이것은 아마도 더 복잡한 작업 일 것입니다. – user3022742

0

당신의 @newFieldName 단지 문자열 :이 테이블의 실제 열을 "가장"하지 않습니다 ... 내가 생각

당신의 아마 당신에 관심이 컬럼의 handfull입니다이 있기 때문에

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을 피하기 이런 식으로 뭔가를 할 수 있지만, 물론 더 열 가능성

+0

저는 여러 개의 컬럼을 가지고 있습니다. 이 SELECT 문은 실제로 루프 내에 있습니다. 열 이름 테이블에서 newFieldName을 읽습니다. 그래도 고마워. – user3022742