正则表达式在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_columnvalue15679 那么

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中查找列值的长度的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式删除Mysql中列值中的括号()

正则表达式查找/替换不同长度的文本

MySQL学习之正则表达式篇

用于在Yaml文件中查找键值的正则表达式

用于查找 <a> 链接的“href”值的正则表达式

在 oracle 中使用正则表达式查找 POBOX - PL/SQL