我正在尝试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/