这是一个简单的方法:
- 不依赖TRIM
- 不依赖 REGEXP
- 允许指定小数和/或千位分隔符(在我的示例中为“.”和“,”)
- 在远至 8i 的 Oracle 版本上运行良好(个人在 8.1.7.4.0 上测试;是的,您没看错)
SELECT
TEST_TABLE.*,
CASE WHEN
TRANSLATE(TEST_TABLE.TEST_COLUMN, 'a.,0123456789', 'a') IS NULL
THEN 'Y'
ELSE 'N'
END
AS IS_NUMERIC
FROM
(
-- DUMMY TEST TABLE
(SELECT '1' AS TEST_COLUMN FROM DUAL) UNION
(SELECT '1,000.00' AS TEST_COLUMN FROM DUAL) UNION
(SELECT 'xyz1' AS TEST_COLUMN FROM DUAL) UNION
(SELECT 'xyz 123' AS TEST_COLUMN FROM DUAL) UNION
(SELECT '.,' AS TEST_COLUMN FROM DUAL)
) TEST_TABLE
结果:
TEST_COLUMN IS_NUMERIC
----------- ----------
., Y
1 Y
1,000.00 Y
xyz 123 N
xyz1 N
5 rows selected.
当然,这可能不是所有方法中最强大的;例如,“.”被错误地识别为数字。然而,它非常简单和快速,并且可以很好地完成这项工作,具体取决于需要处理的实际数据值。
对于整数,我们可以将 Translate 操作简化如下:
TRANSLATE(TEST_TABLE.TEST_COLUMN, 'a0123456789', 'a') IS NULL
工作原理
从上面,请注意Translate 函数的语法是TRANSLATE(string, from_string, to_string)。现在Translate 函数不能接受NULL 作为to_string 参数。
因此,通过将'a0123456789' 指定为from_string 并将'a' 指定为to_string,会发生两件事:
- 字符
a 被单独留下;
-
0 到 9 的数字被替换为空,因为在 to_string 中没有为它们指定替换。
实际上,数字被丢弃了。如果该操作的结果是NULL,则表示它最初是纯数字。