我对Oracle很陌生。
我在Oracle中有一列名为Salary
的列,其值类似于'19000.00'
,NULL
,N/A
,而不是'17500'
。
如何编写返回数字值=无字母或null的sql查询?
在上面的示例中,将为'19000.00'
,'17500.00'
。否则,对于所有非数字值(包括NULL
和字母),返回NULL
。例如,对于NULL
,N/A
,不想说。
select salary from myTable where ...?
答案 0 :(得分:3)
您可以简单地使用正则表达式来过滤表,例如:REGEXP_LIKE(salary, '\d+(\.\d+)?')
此表达式允许一个数字序列,可以选择后面跟一个点和多个数字。
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;