0

我正在尝试一些需要案例中的案例我只是想确保我们是否可以使用多个案例?我在 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

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

4

2 回答 2

1

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

于 2012-04-11T10:48:10.220 回答
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 似乎也不支持正则表达式......)

于 2011-10-18T17:11:08.287 回答