2013-06-01 94 views
1

我的表中有一個NVARCHAR字段。 (使用Oracle 11g)如何檢查字段是字符還是數字?

我想檢查它有char數據或數字數據。

幫我寫一個選擇查詢。 (使用PL-SQL)

我想我可以用case來寫,但我無法實現。 (我有檢查isChar和ISNUMBER沒有方法)

select 
     case <myField> 
      when <isChar> then 
       <this is a char data> 
      when <IsNum> then 
       <this is number data> 
     End 
from <myTable> 

回答

3

使用REGEXP_LIKE

SELECT t.*, 
     CASE 
     WHEN REGEXP_LIKE(column1, '^[0-9]+$') THEN 'Numeric' 
     ELSE 'Char' 
     END data_type 
    FROM table1 t; 

,沒有它

SELECT t.*, 
     CASE 
     WHEN LENGTH(TRIM(TRANSLATE (column1, '',' '))) IS NULL THEN 'Numeric' 
     ELSE 'Char' 
     END data_type 
    FROM table1 t; 

這裏是SQLFiddle演示

兩個v ersions可以根據需要

UPDATE進行調整,以適應期,加號和減號作爲@tbone正確地評價這些查詢沒有分別的時候考慮到NULL S和返回「炭」和「數字」作爲DATA_TYPE column1的值是NULL

至少有兩個選項是如何對付它:

首先只需使用NULL值過濾掉行,如果我們不感興趣

... 
WHERE column1 IS NOT NULL 

介紹NULL(顯然它可以是'N/A'或其他)數據類型CASE

SELECT t.*, 
     CASE 
     WHEN column1 IS NULL THEN NULL 
     ELSE CASE 
     WHEN REGEXP_LIKE(column1, '^[0-9]+$') THEN 'Numeric' 
     ELSE 'Char' 
     END 
     END data_type 
    FROM table1 t 

這裏更新SQLFiddle演示

+0

謝謝。 ♥它的作品:) –

+0

@ R.S不客氣。我很高興它幫助:) – peterm

+0

+1偉大的答案。 – ankurtr

1

試試這個SQL。我在案件陳述中假定有字符數據。

select case <myField> 
     when (ascii(char)>=65 and ascii(char)<=90) OR (ascii(char)>=97 and ascii(char)<=122) 
     then 
        <this is a char data> 
     when ascii(char)>=48 and ascii(char)<=57 
     then 
        <this is number data> 
     End 
from <myTable> 

希望這會有所幫助。

+0

這不是用開關盒結構來寫的!如果您可以用您的建議結構編寫,請編寫... –

+0

ASCII()函數僅返回字符串中第一個字符的結果,所以這對於較長的字符串不起作用。 – Ben

+0

@Ben:同意。我認爲他正在爲單個字符編寫sql。 – ankurtr

相關問題