SQL Server:WHERE,CASE,IN用法

时间:2015-12-04 22:48:04

标签: sql sql-server

我被困在这里。任何人都可以帮助解决以下问题吗? 我无法使用下面的 IN ,还有其他办法吗?

  keywords  "int|if|else|while|float|return|void|breack|for"
  -----------
       int
    |  if
    |  else
    |  while
    |  float
    |  return
    |  void
    |  breack
    |  for

  id  "[a-zA-Z]+[0-9]*[a-zA-Z]*"
  -----------
   [a-zA-Z]+ [0-9]* [a-zA-Z]* 

  integer  "[0-9]+"
  -----------
   [0-9]+ 

  floatt  "[0-9]+[.]+[0-9]+"
  -----------
   [0-9]+ [.]+ [0-9]+ 

  symbols  "[&]{2}|[|]{2}|<=|>=|[=]{2}|!=|/\\*|\\*/|[<>(){};,.+*/=-]"
  -----------
       [&]{2} 
    |  [|]{2} 
    |  <= 
    |  >= 
    |  [=]{2} 
    |  != 
    |  /\* 
    |  \*/ 
    |  [<>(){};,.+*/=-] 


  comment
  -----------
    // [a-zA-Z0-9_]* 

2 个答案:

答案 0 :(得分:2)

Case表达式仅处理标量。可以使用的唯一查询是返回标量的查询。 (一行,一列。)另外一个答案也行不通,因为case对布尔值不起作用。

但是在这种情况下,查询可以转换为:

SELECT * FROM r_table r
WHERE
(
    -- other conditions
)
AND
(
    r.id IN (SELECT e.r_id 
        FROM e_table e 
        WHERE @search_value 
            = CASE @Search_type 
                WHEN 1 THEN e.id
                WHEN 2 THEN e.b_id
                ELSE NULL END
    )
)

答案 1 :(得分:1)

我不知道这是否是最简单的方法,但这样的事情应该有效:

AND (
    @Search_type = 1 AND EXISTS (
        SELECT e.r_id FROM e_table e WHERE @search_value = e.id AND e.r_id = r.id)
    OR
    @Search_type = 2 AND EXISTS (
        SELECT e.r_id FROM e_table e WHERE @search_value = e.b_id AND e.r_id = r.id)
)

See SQL fiddle here