如何在查询中实现数据库无关的ISNUMERIC数值检查?
跨数据库实现ISNUMERIC检查的通用方案
要在SQL Server、Oracle等不同数据库中通用实现「筛选非数字行」的需求,替代数据库专属的ISNUMERIC或REGEXP_LIKE,可以参考以下两种方案:
方案1:使用TRY_CAST(推荐,适配主流版本)
TRY_CAST是ANSI SQL标准函数,SQL Server 2012+、Oracle 12c+都支持它。它会尝试将目标列转换为指定数值类型,转换失败(非数字内容)时返回NULL,刚好匹配你原查询中ISNUMERIC(columnName) = 0的逻辑。
改写后的查询语句:
SELECT name FROM Students WHERE TRY_CAST(columnName AS NUMERIC) IS NULL
如果需要支持小数、负数或更大范围的数值,可以根据业务需求把NUMERIC换成DECIMAL、FLOAT等类型。
方案2:兼容旧版本数据库(比如Oracle 11g及以下)
如果要适配不支持TRY_CAST的旧版Oracle,可以通过分支判断适配不同数据库的函数,写法如下:
SELECT name FROM Students WHERE CASE -- 识别Oracle数据库 WHEN EXISTS (SELECT 1 FROM v$version WHERE banner LIKE 'Oracle%') THEN CASE WHEN TO_NUMBER(columnName DEFAULT NULL ON CONVERSION ERROR) IS NULL THEN 1 ELSE 0 END -- 识别SQL Server数据库 WHEN EXISTS (SELECT 1 FROM sys.databases WHERE name = 'master') THEN CASE WHEN TRY_CAST(columnName AS NUMERIC) IS NULL THEN 1 ELSE 0 END END = 1
这个写法通过数据库专属系统表判断当前环境,再调用对应兼容函数实现逻辑。
内容的提问来源于stack exchange,提问作者Zaquille Morton
相关产品推荐
相关产品推荐

