【发布时间】:2014-01-21 19:27:03
【问题描述】:
我正在尝试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.
现在对 2 个问题感到非常困惑。
1) 我也得到+1,2034.89.00 结果,我应该消除它。 (意思是,两位小数)不只是小数点,其他特殊字符(-+,)中的双倍应删除)
2)为了让它更丑,计划做一个REGEXP_COUNT('.') <= 1。但它并没有返回我的期望,在选择它时,我看到返回了奇怪的值。
谁能帮我把REGEXP框起来,以避免('.','+','-')的双重出现
【问题讨论】:
-
REGEXP_COUNT('.')计算字符串中的所有字符。所以应该是REGEXP_COUNT('\.')