where子句中的动态列名

Rag*_*hav 1 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
Run Code Online (Sandbox Code Playgroud)

这个查询给了我错误(where子句中的非布尔表达式).

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

所以,当我给予@temp = 'C'它然后它应该搜索[company_name] = @name.并列出了一长串@temp values(employee name, company name, city name, state name, supervisor name etc).

Jak*_* T. 6

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

where   case when @temp = 'e' then [em_name]
      case when @temp = 'c' then [company_name] 
    end
      = @name
Run Code Online (Sandbox Code Playgroud)

应该:

WHERE CASE WHEN @temp = 'e' THEN em_name
        WHEN @temp = 'c' THEN company_name 
    END = @name
Run Code Online (Sandbox Code Playgroud)

请注意,现在只有一个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)
Run Code Online (Sandbox Code Playgroud)