如何检查字段是字符还是数字?

R.S*_*R.S 3 sql oracle plsql

我的表中有一个 NVARCHAR 字段。(使用Oracle 11g)

我想检查它有字符数据或数字数据。

帮我写一个选择查询。(使用 PL-SQL)

我想我可以用案例来写它,但我无法实现它。(我没有方法检查 isChar 和 isNumber)

select
       case <myField>
           when <isChar> then
               <this is a char data>
           when <IsNum> then
               <this is number data>
       End
from <myTable>
Run Code Online (Sandbox Code Playgroud)

pet*_*erm 5

使用REGEXP_LIKE

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

没有它

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

这是SQLFiddle演示

如果需要,两个版本都可以调整以适应句号、加号和减号

更新NULL正如@tbone正确注释的那样,当column1的值为 时,这些查询不考虑s 并分别返回“Char”和“Numeric”作为 data_type NULL

至少有两种处理方法:

首先,NULL如果我们对值不感兴趣,则简单地过滤掉具有值的行

...
WHERE column1 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

其次引入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
Run Code Online (Sandbox Code Playgroud)

这是更新的SQLFiddle演示