仅选择数字值,否则返回NULL

时间:2019-09-02 10:27:30

标签: sql oracle

我对Oracle很陌生。

我在Oracle中有一列名为Salary的列,其值类似于'19000.00'NULLN/A,而不是'17500'

如何编写返回数字值=无字母或null的sql查询?

在上面的示例中,将为'19000.00''17500.00'。否则,对于所有非数字值(包括NULL和字母),返回NULL。例如,对于NULLN/A,不想说。

select salary from myTable where ...?

2 个答案:

答案 0 :(得分:3)

您可以简单地使用正则表达式来过滤表,例如:REGEXP_LIKE(salary, '\d+(\.\d+)?')

此表达式允许一个数字序列,可以选择后面跟一个点和多个数字。

Demo on DB Fiddle

with x as (
    SELECT 'N/A' salary FROM DUAL
    UNION ALL SELECT NULL FROM DUAL
    UNION ALL SELECT '19000.00' FROM DUAL
    UNION ALL SELECT '17500' FROM DUAL
)
SELECT * FROM x WHERE REGEXP_LIKE(salary, '\d+(\.\d+)?')

收益:

| SALARY   |
| :------- |
| 19000.00 |
| 17500    |

PS:如果不想过滤掉非数字值,而是将其替换为NULL,则:

SELECT CASE WHEN REGEXP_LIKE(salary, '\d+(\.\d+)?') THEN salary END FROM x 

答案 1 :(得分:1)

从Oracle 12.2开始,您可以使用VALIDATE_CONVERSION

select salary
from my_table
where VALIDATE_CONVERSION(salary AS NUMBER) = 1;

或为非数字显示NULL:

select case when VALIDATE_CONVERSION(salary AS NUMBER) = 1 then salary end 
from my_table;