【问题标题】:select only numeric values otherwise return NULL仅选择数值,否则返回 NULL
【发布时间】:2019-09-02 10:27:30
【问题描述】:

我对 Oracle 还是很陌生。

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

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

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

select salary from myTable where ...?

【问题讨论】:

  • 不要在varchar 列中存储数字
  • 您使用的是哪个版本的 Oracle?

标签: sql string oracle where-clause


【解决方案1】:

您可以简单地使用正则表达式来过滤表格,例如: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 

【讨论】:

    【解决方案2】:

    从 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2021-12-25
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2023-03-31
      相关资源
      最近更新 更多