我有一个代码如下:
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功能,但它不起作用。
谢谢!
答案 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)
最佳解决方案是在进入数据库之前验证并过滤此类输入。 但事实并非如此,一个可行的解决方案: