案例陈述逻辑

时间:2011-08-19 13:41:06

标签: tsql case

让我们轻松一点。

我有一张桌子。

visitID   studentname      dob       roll.no     value    displIndex     propID
200019      rob         05/18/1937     101      smoking       2             83
200019      rob         05/18/1937     101                    2             91
200019      rob         05/18/1937     101      alcohol       1             83
200019      rob         05/18/1937     101                    1             91
200020      henry       08/20/1987     102      smoking       2             83
200020      henry       08/20/1987     102                    2             91
200021      king        09/21/1982     103      alcohol       1             83
200021      king        09/21/1982     103                    1             91

我有一张类似的表。

现在我要做的是,如果该学生的特定visitID没有显示索引为1,那么在case语句中返回值'779'

select visitID,studentname
       ,dob
       ,roll.no
       ,value
       ,dispIndex
       ,propID
       ,case 
             WHEN (PATINDEX('%smoking%',value) >0 OR
                  (PATINDEX('%sometimes smoking%',value) > 0) THEN
                        '777'
              WHEN (PATINDEX(%not smoking%,value) >0 OR
                   (PATINDEX(%do not smoke%,value) >0_  THEN
                          '778'
             WHEN (ISNULL(CAST(value as varchar(max)),'')='') THEN
                          '779'
              ELSE
                          '779'
             END VALUE

国王在吸烟时没有记录。所以我希望它进入779桶。我该怎么做?

1 个答案:

答案 0 :(得分:0)

不确定为什么你在这里进行演员(基于你的样本数据),所以改变这个:

WHEN (ISNULL(CAST(value as varchar(max)),'')='') THEN '779'

对此:

WHEN ISNULL(value,'') = '' THEN '779'

另外 - 意识到你做通配符的方式,你所有的“不吸烟”值将是'777'因为它们与第一个模式(PATINDEX('%smoking%',value)匹配(即第二个模式赢了甚至要检查。

修改
在评论中回答您的问题:


1)它如何拉动国王的记录 - >吸烟 - > displayIndex 2?
答案:您的样本集中没有任何记录,显示指数为2.您无法提取不存在的记录。

2)我想检查...酒精记录 答案:您已经为吸烟者解决了这个问题。非吸烟者。对酒精做同样的事情。例如:WHEN PATINDEX('%alchohol%',value) > 0 THEN '779'

3)我想把国王学生放在779岁以下 回答:他是。 CASE语句的工作方式,如果WHEN条件都没有计算到true(即...WHEN PATINDEX('%smoking%',value) > 0),则使用ELSE语句。由于没有任何WHEN语句将评估为true为King,他将在779之下。