2013-06-01 118 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

相关问题