sql - 过滤 SQL 列中仅包含数字数据的行

标签 sql regex oracle

我正在尝试SELECT表中的行,通过应用仅识别数字列的过滤条件。这是一个仅报告的查询,因此我们最不关心性能,因为我们没有编译 PL/SQL 的权限,无法通过 TO_NUMBER() 检查并返回是否为数字。

我必须用SQL来实现它。该列还具有这样的值,必须将其视为数字。

-1.0
-0.1
-.1
+1,2034.89
+00000
1023

经过开创性的研究,我写了这篇文章。(困难时期)

  WITH dummy_data AS
  ( SELECT '-1.0' AS txt FROM dual
  UNION ALL
  SELECT '+0.1' FROM dual
  UNION ALL
  SELECT '-.1' FROM dual
  UNION ALL
  SELECT '+1,2034.89.00' FROM dual
  UNION ALL
  SELECT '+1,2034.89' FROM dual
  UNION ALL
  SELECT 'Deva +21' FROM dual
  UNION ALL
  SELECT '1+1' FROM dual
  UNION ALL
  SELECT '1023' FROM dual
  )
SELECT dummy_data.*,
  REGEXP_COUNT(txt,'.')
FROM dummy_data
WHERE REGEXP_LIKE (TRANSLATE(TRIM(txt),'+,-.','0000'),'^[-+]*[[:digit:]]');

我明白了。

TXT           REGEXP_COUNT(TXT,'.')
------------- ---------------------
-1.0                              4
+0.1                              4
-.1                               3
+1,2034.89.00                    13 /* Should not be returned */
+1,2034.89                       10
1+1                               3 /* Should not be returned */
1023                              4

7 rows selected.

现在对两个问题感到非常困惑。

1) 我得到+1,2034.89.00结果也是如此,我应该消除它。 (意味着两个小数点)不仅仅是小数点,其他所有特殊字符(-+,)中的 double 都应该被消除)

2)为了让它更丑,计划做一个REGEXP_COUNT('.') <= 1 。但它没有返回我的期望,在选择它时,我看到返回了奇怪的值。

有人可以帮我把REGEXP框起来吗?为了避免 ('.','+','-') 的双重出现

最佳答案

以下表达式适用于除逗号之外的所有内容:

'^[-+]*[0-9,]*[.]*[0-9]+$'

您可以通过其他检查来检查逗号位置是否错误:

not regexp_like(txt, '[-+]*,$') and not regexp_like(txt, [',,'])

关于sql - 过滤 SQL 列中仅包含数字数据的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233534/

相关文章:

python - 如何更改 re.sub 中的十进制数的十六进制数

sql - 如何在 oracle sql 查询中生成行项目编号

oracle - 如果在 services.msc 中不可用,如何启动 Oracleserviceorcl

sql - WM_CONCAT 使用案例

php - MySQL 在删除后继续添加 2 个额外的行!

sql - 使用时间戳过滤/WHERE

sql - 星号在oracle sql中的使用

sql - 根据另一列的最大值获取值

javascript - Jquery,当类不是第一个时递增类正则表达式

Python正则表达式匹配行中的第二个或第三个单词