Fgb*_*nch 35 oracle plsql oracle10g
我正在尝试检查oracle(10g)查询中的列中的值是否为数字以便进行比较.就像是:
select case when ( is_number(myTable.id) and (myTable.id >0) )
then 'Is a number greater than 0'
else 'it is not a number'
end as valuetype
from table myTable
Run Code Online (Sandbox Code Playgroud)
关于如何检查的任何想法?
Sai*_*ish 61
这里提到的另一个想法是使用正则表达式来检查:
SELECT foo
FROM bar
WHERE REGEXP_LIKE (foo,'^[[:digit:]]+$');
Run Code Online (Sandbox Code Playgroud)
好的部分是你不需要单独的PL/SQL函数.可能存在问题的部分是正则表达式可能不是大量行的最有效方法.
Jus*_*ave 32
假设ID列myTable
未被声明为NUMBER(这似乎是一个奇怪的选择并且可能有问题),您可以编写一个函数,尝试将(可能是VARCHAR2)ID转换为数字,捕获异常,并且返回'Y'或'N'.就像是
CREATE OR REPLACE FUNCTION is_number( p_str IN VARCHAR2 )
RETURN VARCHAR2 DETERMINISTIC PARALLEL_ENABLE
IS
l_num NUMBER;
BEGIN
l_num := to_number( p_str );
RETURN 'Y';
EXCEPTION
WHEN value_error THEN
RETURN 'N';
END is_number;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在查询中嵌入该调用,即
SELECT (CASE WHEN is_number( myTable.id ) = 'Y' AND myTable.id > 0
THEN 'Number > 0'
ELSE 'Something else'
END) some_alias
FROM myTable
Run Code Online (Sandbox Code Playgroud)
请注意,尽管PL/SQL具有布尔数据类型,但SQL不具有.因此,虽然您可以声明一个返回布尔值的函数,但您不能在SQL查询中使用这样的函数.
Mat*_*rne 15
Saish使用的答案REGEXP_LIKE
是正确的想法,但不支持浮动数字.这个会......
返回数值
SELECT foo
FROM bar
WHERE REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
Run Code Online (Sandbox Code Playgroud)
返回值不是数字
SELECT foo
FROM bar
WHERE NOT REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
Run Code Online (Sandbox Code Playgroud)
您可以自己测试您的正则表达式,直到您的心满意为止http://regexpal.com/ (但请确保在此换行符中选中复选框匹配).
小智 5
你可以在ORACLE(10g)中使用正则表达式函数'regexp_like',如下所示:
select case
when regexp_like(myTable.id, '[[:digit:]]') then
case
when myTable.id > 0 then
'Is a number greater than 0'
else
'Is a number less than or equal to 0'
end else 'it is not a number' end as valuetype
from table myTable
Run Code Online (Sandbox Code Playgroud)
这是查找Oracle中不包含数字数据的行的潜在副本.另请参阅:如何确定SQL中的字符串是否为数字?.
这是一个基于Michael Durrant的解决方案,适用于整数.
SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'0123456789',' ')), NULL, 'number','contains char') = 'number'
Run Code Online (Sandbox Code Playgroud)
Adrian Carneiro发布了一个适用于小数和其他的解决方案.然而,正如Justin Cave指出的那样,这将错误地将字符串分类为'123.45.23.234'或'131 + 234'.
SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'+-.0123456789',' ')), NULL, 'number','contains char') = 'number'
Run Code Online (Sandbox Code Playgroud)
如果您需要没有PL/SQL或REGEXP_LIKE的解决方案,这可能会有所帮助.
归档时间: |
|
查看次数: |
179421 次 |
最近记录: |