2014-07-09 85 views
1

使用情況下,我有一個是這樣的代碼:對空字符串

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功能,但它不起作用。

謝謝!

回答

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 ... 

注意,不需要單獨trimregexp_replace

+0

基本上這是不爲空,因爲用戶僅輸入空格,它是使我們的系統,我當前的代碼必須處理的。 – jeff

+0

@ user3820337 - 通過「trim」後它爲空。 –

+0

謝謝你,現在工作正常,一個問題,雖然我看到用戶輸入的一些條目進入而不是空間,TRIM是否也處理下一行? – jeff

0

最好的解決方案是在輸入數據庫之前驗證並過濾這種輸入。 但因爲這是不是這樣,一個解決方案,它可以工作:

regexp_matches()