where子句中的动态列名

时间:2011-05-09 05:27:12

标签: sql-server sql-server-2008

declare @temp varchar(20)
declare @name varchar(20)
set @name = 'John'
set @temp  = 'e'
select * from TableA
    where   case when @temp = 'e' then [em_name]
          case when @temp = 'c' then [company_name] 
        end
          = @name

此查询给出了错误(where子句中的非布尔表达式)。

请解释此查询中的错误,如何在没有动态sql的情况下实现此目的。

所以,当我提供@temp = 'C'时,它应该搜索[company_name] = @name。并有一长列@temp values(employee name, company name, city name, state name, supervisor name etc)

2 个答案:

答案 0 :(得分:6)

您发布的剪辑中存在语法错误:

where   case when @temp = 'e' then [em_name]
      case when @temp = 'c' then [company_name] 
    end
      = @name

应该是:

WHERE CASE WHEN @temp = 'e' THEN em_name
        WHEN @temp = 'c' THEN company_name 
    END = @name

注意现在只有一个CASE关键字。这是更常见的语法(为了完整性):

DECLARE @temp VARCHAR(20)
DECLARE @name VARCHAR(20)
SET @name = 'John'
SET @temp = 'e'

SELECT *
FROM TableA
WHERE (@temp = 'e' AND [em_name] = @name)
    OR (@temp = 'c' AND [company_name] = @name)

答案 1 :(得分:2)

SELECT *
FROM TableA
WHERE (@temp = 'e' AND [em_name] = @name) OR (@temp = 'c' AND [company_name] = @name)