我们可以在sql中有多个case then语句吗?

时间:2011-10-18 15:34:34

标签: sql case teradata

我正在尝试一些需要案例的情况我只是想确定我们是否可以使用多个案例?我在sql teradata上运行它 我试图使用的代码如下

AND(
    case when CHARACTER_LENGTH(drug.n)=0 then 0 

     when CHARACTER_LENGTH(drug.n)=1 then
     (case when substring(drug.n from  1,1) in            (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end)


     when CHARACTER_LENGTH(drug.n)=2 then 
     (case when substring(drug.n from  1,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  2,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end ) 


     when CHARACTER_LENGTH(drug.n)=3 then 
     (case when substring(drug.n from  1,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  2,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  3,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end )=1

如果有人有更好的想法,你可以告诉我。我不能使用isnumeric函数。

2 个答案:

答案 0 :(得分:1)

是的,您可以使用嵌套的CASE语句。在Teradata中没有问题

答案 1 :(得分:0)

好的 -
要确定任意长度字符串是否仅包含数字字符(或不包含),可以使用重复CTE。

请注意,我不知道您的RDBMS是否实际支持递归CTE,但这是一个潜在的解决方案。此外,我不确定性能的影响 - 但是,它确实消除了多个CASE效果(为什么这不是一个实际的数字字段,反正呢?)。

所以...对于一个看起来像这样的表:

id   ch
================
1   1234567890
2   asdg      

此语句返回包含数字字符(任意长度)的所有行:

WITH splitstring (id, chard, start, orig) as (
                  SELECT id, SUBSTRING(ch, 1, 1), 1, ch
                  FROM chartable
                  UNION ALL
                  SELECT id, SUBSTRING(orig, start + 1, 1), start + 1, orig
                  FROM splitstring
                  WHERE LENGTH(orig) > start)
SELECT * 
FROM chartest as a
WHERE NOT EXISTS (SELECT '1'
                  FROM splitstring as b
                  WHERE a.id = b.id
                  AND chard NOT BETWEEN '0' AND '9')

如果没有一些较大的背景,很难确切地知道你想要完成什么。但是,这应该适合您的需求。

(作为旁注,iSeries的DB2似乎也不支持正则表达式...)