select a.* ,b.pa_name, c.tp_name , d.dd_name from patientreport a , patient b , b_testprofile c , sysdictdetail d where d.dd_name='生物' and a.type=d.dd_code and b.ch_id='CH04123000001' and a.pa_id=b.pa_id and a.tp_code=c.tp_code and 
isUserInput in (
case 
when ('全部'='已做') then ('2') 
when ('全部'='未做') then ('1') 
when ('全部'='全部') then ('1','2') 
end
)该语句在查询分析器中报错,"第6行 , 号附近有语法错误我把该语句改成
select a.* ,b.pa_name, c.tp_name , d.dd_name from patientreport a , patient b , b_testprofile c , sysdictdetail d where d.dd_name='生物' and a.type=d.dd_code and b.ch_id='CH04123000001' and a.pa_id=b.pa_id and a.tp_code=c.tp_code and 
isUserInput in ('1','2')
系统就可以查询, 请问高手我的case语句是不是有问题啊?? 

解决方案 »

  1.   

    是不是这样的呀
    case 字段 when 值 then ('2') end
    case 字段 when 值 then ('1') end
    case 字段 where 值 then ('1','2') end
      

  2.   

    isUserInput 是字段吗?
    若是 则
    isUserInput in 
    case 
    when '全部'='已做' then ('2') 
    when '全部'='未做' then ('1') 
    else '全部'='全部' then ('1','2') 
    end
    不知道搂主什么意思,条件语句是常量为什么还要比较,或许你得意思是:已作,未作和全部查询。
    若是,你用case语句实在不妥,你可以些个存储过程来完成,或者通过一个tinyint变量传递:
    0:全部,1:未作,2已作。
      

  3.   

    CASE 字段 WHEN 值 THEN 结果1 ELSE 结果2 END
      

  4.   

    不好意思,在else里把 '全部'='全部' then 拿掉
      

  5.   

    明白了搂主得意思 建议:这样:
    select a.* ,b.pa_name, c.tp_name , d.dd_name from patientreport a , patient b , b_testprofile c , sysdictdetail d where d.dd_name='生物' and a.type=d.dd_code and b.ch_id='CH04123000001' and a.pa_id=b.pa_id and a.tp_code=c.tp_code and 
    isUserInput >=isuserinputqs and isUserInput <=isuserinputzz
    其中isuserinputqs 和isuserinputzz是变量你可以这样赋值
    已作 isuserinputqs=2 ,insuserinpitzz=2
    未作 isuserinputqs=1 ,insuserinpitzz=1
    全部 isuserinputqs=1 ,insuserinpitzz=2
    就搞定了,最好不要用case,它会影响你得查询速度
      

  6.   

    isUserInput in (
    case 
    when '全部'='已做' then ('2') 
    when '全部'='未做' then ('1') 
    else ('1','2') 
    end
    )
    这句我也试过,还是报上面的错误 , 我是想通过isuserinput字段的值来进行全部或者局部的查询,这样做是否妥当暂且不论,但是他为什么会报错,错在什么地方,我却是一点头绪都没有
    gamaster(a明)  谢谢你的提示,我会仔细考虑一下,那种方式比较适合.还有谢谢Kshape() 和lbd8848(lbd)  尽管问题还没解决 呵呵
      

  7.   

    isuserinput 什么数据类型 若是字符型
    我给得解法是吧case语句外面得括号去掉,你怎么还带上
      

  8.   

    或许 then后不支持这种写法 ('2')
      

  9.   

    select 1 where 1 in (case when 1=1 then (1) when 2=2 then(2) else(1) end)
    这样可以,但这样就不行
    select 1 where 1 in (case when 1=1 then (1) when 2=2 then(2) else(1,2) end)
    报和你一样得错误
    可见 不支持这种写法
      

  10.   

    如果后面条件就这几个可考虑使用charindex 函数,为什么非要用in呢
    case 字段 when '已做' then charindex('1',isuserinput)>0
    case 字段 when '未做' then charindex('2',isuserinput)>0不知可不可以,~
      

  11.   

    如果你非得用in得话 可以由选择条件 赋值in条件字符串:
    isuserinput in s_in
    已作:s_in='(''2'')'
    未作:s_in='(''1'')'
    全部:s_in='(''1'',''2'')'
    方法太多了
      

  12.   

    CASE 具有两种格式: 
    1.简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 
    2.CASE 搜索函数计算一组布尔表达式以确定结果。 
    = a.au_id
      

  13.   

    A. 使用带有简单 CASE 函数的 SELECT 语句
    在 SELECT 语句中,简单 CASE 函数仅检查是否相等,而不进行其它比较。下面的示例使用 CASE 函数更改图书分类显示,以使其更易于理解。USE pubs
    GO
    SELECT   Category = 
          CASE type
             WHEN 'popular_comp' THEN 'Popular Computing'
             WHEN 'mod_cook' THEN 'Modern Cooking'
             WHEN 'business' THEN 'Business'
             WHEN 'psychology' THEN 'Psychology'
             WHEN 'trad_cook' THEN 'Traditional Cooking'
             ELSE 'Not yet categorized'
          END,
       CAST(title AS varchar(25)) AS 'Shortened Title',
       price AS Price
    FROM titles
    WHERE price IS NOT NULL
    ORDER BY type, price
    COMPUTE AVG(price) BY typeB. 使用带有简单 CASE 函数和 CASE 搜索函数的 SELECT 语句
    在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。下面的示例根据图书的价格范围将价格(money 列)显示为文本注释。USE pubs
    GO
    SELECT    'Price Category' = 
          CASE 
             WHEN price IS NULL THEN 'Not yet priced'
             WHEN price < 10 THEN 'Very Reasonable Title'
             WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
             ELSE 'Expensive book!'
          END,
       CAST(title AS varchar(20)) AS 'Shortened Title'
    FROM titles
    ORDER BY price
    GO
    C. 使用带有 SUBSTRING 和 SELECT 的 CASE 函数
    下面的示例使用 CASE 和 THEN 生成一个有关作者、图书标识号和每个作者所著图书类型的列表。 USE pubs
    SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+ 
       RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
       Type = 
      CASE 
        WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
        WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
        WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
        WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
        WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
      END
    FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id
      

  14.   

    谢谢大家替我出谋划策,不过我觉得 的这种办法不错,学到了一种新思路
    select a.* ,b.pa_name, c.tp_name , d.dd_name from patientreport a , patient b , b_testprofile c , sysdictdetail d where d.dd_name='生物' and a.type=d.dd_code and b.ch_id='CH04123000001' and a.pa_id=b.pa_id and a.tp_code=c.tp_code and 
    isUserInput >=isuserinputqs and isUserInput <=isuserinputzz
    其中isuserinputqs 和isuserinputzz是变量你可以这样赋值
    已作 isuserinputqs=2 ,insuserinpitzz=2
    未作 isuserinputqs=1 ,insuserinpitzz=1
    全部 isuserinputqs=1 ,insuserinpitzz=2
    就搞定了,最好不要用case,它会影响你得查询速度