2

我的表中有一个 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>
4

2 回答 2

4

使用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, '0123456789',' ')))  IS NULL THEN 'Numeric' 
         ELSE 'Char' 
       END data_type 
  FROM table1 t;

这是SQLFiddle演示

两个版本都可以根据需要进行调整以适应句点、加号和减号

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

如何处理它至少有两种选择:

首先NULL,如果我们对它们不感兴趣,只需过滤掉具有值的行

...
WHERE column1 IS NOT NULL

Second Introduce 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演示

于 2013-06-01T05:49:37.043 回答
1

试试这个 SQL。我假设在 case 语句中有字符数据。

 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>

希望这可以帮助。

于 2013-06-01T05:49:43.160 回答