在空字符串上使用CASE

时间:2014-07-09 12:46:05

标签: sql case oracle-sqldeveloper

我有一个代码如下:

SELECT
'"35933-14",' ||
'"' || us_1.gr_UniqueName || '",' ||
'"' || (CASE WHEN us_1.mls0_PrimaryString = '' THEN 'This is empty' 
    WHEN CAST(Length(us_1.mls0_PrimaryString) AS INT) < 4 THEN ('Less than 4: '|| SUBSTR(us_1.mls0_PrimaryString,1,10000)) 
   ELSE SUBSTR(us_1.mls0_PrimaryString,1,10000)  END) || '",' ||
'"",' ||
'"",' ||
'""' 
FROM 
us_GroupTab us_1 
WHERE (us_1.gr_Active = 1) 
AND (us_1.gr_PurgeState = 0) 
AND (us_1.gr_PartitionNumber = 0)
AND (us_1.gr_UniqueName IN ('US_HARDWARE_1', 'US_HARDWARE_2','GROUP_NULL'));

基本上问题是并非所有空字符串都被处理,一些用户只输入第一个case语句不处理的多个空格。有没有办法做到这一点,我尝试过使用TRIM功能,但它不起作用。

谢谢!

2 个答案:

答案 0 :(得分:3)

空字符串与Oracle中的null相同,您无法将任何内容与null进行比较。您需要使用is null代替= null= ''

CASE WHEN TRIM(us_1.mls0_PrimaryString) IS null THEN 'This is empty' ...

您也不需要cast长度检查int。在12c之前varchar2的最大长度为4000个字符,因此在substr中使用10000是没有意义的。事实上,第一个substr无论如何都不会做任何事情,因为你已经知道长度小于4。

如果你想在检查之前删除新行和回车 - 这可能是你应该在客户端做的事情,除非你想存储它们 - 那么你可以先替换它们:

CASE WHEN TRIM(REPLACE(REPLACE(us_1.mls0_PrimaryString, CHR(10)), CHR(13))) IS null
THEN ...

或者更一般地删除所有会捕捉制表符等的空格:

CASE WHEN REGEXP_REPLACE(us_1.mls0_PrimaryString, '[[:space:]]') IS NULL THEN ...

或者:

CASE WHEN REGEXP_LIKE(us_1.mls0_PrimaryString, '^[[:space:]]*$') THEN ...

请注意,不需要单独trim regexp_replace

答案 1 :(得分:0)

最佳解决方案是在进入数据库之前验证并过滤此类输入。 但事实并非如此,一个可行的解决方案:

regexp_matches()