正则表达式在sql中查找列值的长度
Posted
技术标签:
【中文标题】正则表达式在sql中查找列值的长度【英文标题】:Regex to find length of the column value in sql 【发布时间】:2014-08-05 17:52:30 【问题描述】:我创建了一个查询来查找我传递的值是字母数字还是数字 通过使用此查询:
SELECT COUNT (*)
INTO l_col
FROM DUAL
WHERE REGEXP_LIKE (l_columnvalue, '^\d+(\.\d+)?$', '');
IF l_col > 0 THEN
NULL;
ELSE
l_columnvalue := '"' || l_columnvalue || '"';
END IF;
此代码检查l_columnvalue
是否为数字,如果是,则l_col
将大于0,否则l_columnvalue
将用引号" "
括起来。
现在我想检查columnvalue
是否是一个数字并且它的长度等于7。如果是这样,那么它不应该在引号""
中,否则如果它是一个数字并且它的长度小于或大于超过 7 则应该用引号引起来。
我该如何使用正则表达式?
**Example :**
如果l_columnvalue
是15679
那么
query1 将返回 1,并相应地执行 if
语句。
如果是'abdg12'
,那么query1 将返回null
,然后执行else 语句,输出为"abdg12"
现在我想如果l_columnvalue
是数字并且它的长度不是 7,例如:123
那么查询 1 不应该返回 1 而输出应该是 "123"
怎么办?
【问题讨论】:
请使用示例数据和所需结果编辑您的查询。 @GordonLinoff 完成。请检查 只需在 where 子句后附加and length(l_columnvalue) = 7
。
【参考方案1】:
如果您打算在 PL/SQL 中实现这个逻辑(看起来像这样),那么一个函数(无论是独立函数还是包函数的一部分)可能看起来像这样:
create or replace function nameTheFunction(
p_expr in varchar2 -- based on information you've provided
) return varchar2 -- an actual parameter may be either numeric
is -- or alphanumeric, thus varchar2
l_result varchar2(101); -- adjust the size as needed
l_isDigit boolean;
begin
l_isDigit := regexp_like(p_expr, '^[[:digit:]]+$');
return case
when (l_isDigit and length(p_expr) < 7) or (not l_isDigit)
then dbms_assert.enquote_name(p_expr)
else p_expr
end;
end;
无需使用select into
语句,无需在PL/SQL 和SQL 引擎之间做额外的切换。 regexp_like()
函数可以直接在 PL/SQL 块中使用:
测试用例:
column res format a11
clear screen;
with t1(col) as(
select '1234567' from dual union all
select 'ah123' from dual union all
select '1234' from dual
)
select nameTheFunction(col) as res
from t1
结果:
RES
-----------
1234567
"AH123"
"1234"
【讨论】:
【参考方案2】:只需在 if 中添加另一个条件,如下所示
IF ( l_col > 0 AND length(l_columnvalue) > 7 )
【讨论】:
【参考方案3】:虽然您可以使用正则表达式来执行此操作,但还有其他选项。例如,您可以尝试将字符串转换为 NUMBER - 如果成功,它是一个数字,您可以检查长度 - 如果转换失败,它不是一个数字。例如:
DECLARE
strNumeric_value VARCHAR2(100) := '1234567890';
strNonnumeric_value VARCHAR2(100) := '123A56789o';
nValue NUMBER;
BEGIN
BEGIN
nValue := TO_NUMBER(strNumeric_value);
EXCEPTION
WHEN OTHERS THEN
nValue := NULL; -- not numeric
END;
DBMS_OUTPUT.PUT_LINE('strNumeric_value ' ||
CASE
WHEN nValue IS NOT NULL THEN
'IS NOT '
ELSE
'is '
END || 'numeric');
BEGIN
nValue := TO_NUMBER(strNonnumeric_value);
EXCEPTION
WHEN OTHERS THEN
nValue := NULL; -- not numeric
END;
DBMS_OUTPUT.PUT_LINE('strNonnumeric_value ' ||
CASE
WHEN nValue IS NOT NULL THEN
'IS NOT '
ELSE
'is '
END || 'numeric');
END;
分享和享受。
【讨论】:
以上是关于正则表达式在sql中查找列值的长度的主要内容,如果未能解决你的问题,请参考以下文章