正则表达式在sql中查找列值的长度

时间:2014-08-05 17:52:31

标签: sql regex oracle plsql

我创建了一个查询来查找我传递的值是字母数字还是数字 使用此查询:

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"

如何去做?

3 个答案:

答案 0 :(得分:0)

只需添加另一个条件,如下所示

IF ( l_col > 0 AND length(l_columnvalue) > 7 )

答案 1 :(得分:0)

如果您计划在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 :(得分:0)

虽然您可以使用正则表达式执行此操作,但还有其他选项。例如,您可以尝试将字符串转换为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;

分享并享受。