检查最后两位数字是否为字母

时间:2015-08-11 13:26:22

标签: sql regex plsql substring

我在表格中有一个列,其中包含以下值:

部分

1000-001-2211 

1000-001-2211AA

1000-001-2211AB

1000-001-2211AQ

1000-001-2211BI

如果每个值都不是数字,我需要特别显示每个值的最后两个字符。例如,我的预期输出应该是这样的:

部分| last_two_char

1000-001-2211   |         

1000-001-2211AA | AA

1000-001-2211AB | AB

1000-001-2211AQ | AQ

1000-001-2211BI | BI

如何使用SQL查询获取此输出?

4 个答案:

答案 0 :(得分:1)

使用SUBSTRINSTRTO_NUMBER的方法之一。由于您已标记为PLSQL

这很有效。你可以尝试一下吗?

首先创建一个function来验证作为参数传递的字符串。

  CREATE or replace FUNCTION is_number (p_string IN VARCHAR2)
  RETURN varchar2
    IS
    v_new_num varchar2(2000);
  BEGIN
    v_new_num := TO_NUMBER(p_string);
    RETURN NULL;
  EXCEPTION
    WHEN VALUE_ERROR THEN
    RETURN p_string;
  END is_number;

-- function created

然后使用以下任何一个查询来获得所需的输出:

  select part,check_part,(part ||' | ' ||  req_part) As Final_part from
        (
        select part,(substr(part,-2,instr(part,'-',1,1) ) ) as check_part,
        IS_NUMBER( (substr(part,-2,instr(part,'-',1,1) ) )) as req_part
         -- calling IS_NUMBER function
        from parts
        ) parts;

           -- OR

  select part,check_part,(part ||' | ' ||  req_part) As Final_part from
        (
        select part,substr(part,-2,2) as check_part,
        IS_NUMBER(substr(part,-2,2)) as req_part
         -- calling IS_NUMBER function
        from parts
        ) parts;

<强>输出:

    PART       CHECK_PART      FINAL_PART
1000-001-2211     11        1000-001-2211 | 
1000-001-2211AA   AA        1000-001-2211AA | AA
1000-001-2211AB   AB        1000-001-2211AB | AB
1000-001-2211AQ   AQ        1000-001-2211AQ | AQ
1000-001-2211BI   BI        1000-001-2211BI | BI

测试屏幕截图:

output

答案 1 :(得分:1)

您可以使用REGEXP_LIKE

尝试这些简单的

SUBSTRINSTRREGEXP_LIKE

一起使用
Select part || ' | '   || NULL as FINAL_PART
from parts -- to check number
where NOT REGEXP_LIKE ( (substr(part,-2,instr(part,'-',1,1) ) ), '[a-zA-Z]') 
UNION 
Select part || ' | '   || (substr(part,-2,instr(part,'-',1,1) ) ) 
from parts -- to check aplhabets
where  REGEXP_LIKE ( (substr(part,-2,instr(part,'-',1,1) ) ), '[a-zA-Z]') ;

仅使用SUBSTRREGEXP_LIKE

Select part || ' | '   || NULL as FINAL_PART
from parts -- to check number
where NOT REGEXP_LIKE( substr(part,-2,2), '[a-zA-Z]') 
UNION 
Select part || ' | '   || substr(part,-2,2) 
from parts -- to check aplhabets
where  REGEXP_LIKE( substr(part,-2,2) , '[a-zA-Z]' ) ;

输出

output tested

答案 2 :(得分:1)

以下查询将帮助您获取所需的结果:

让我们创建下表:

CREATE TABLE chartable( col1 Varchar2(200));

让我们将值插入其中:

insert into chartable values('1000-001-2211BI');
insert into chartable values('1000-001-2211AQ');
insert into chartable values('1000-001-2211AB');
insert into chartable values('1000-001-2211');
insert into chartable values('1000-001-2211AA');

COMMIT;

在查询下方,您将获得所需的结果:

select out.col1 || '|' || ( select substr(col1,-2,2) from chartable ins 
      where ins.col1 = out.col1 AND 
            regexp_like( (substr(col1,-2,2)) , '[A-Za-z]{2}' ) ) as part 
FROM chartable out;

结果:

part
1000-001-2211|
1000-001-2211AA|AA
1000-001-2211AB|AB
1000-001-2211AQ|AQ
1000-001-2211BI|BI

在这里,SUBSTR funstion将帮助您获取最后两个字符。

然后,我们使用REGEXP_LIKE函数检查最后两个字符是CHARCACTER。

答案 3 :(得分:0)

这应该有效。使用RIGHT功能选择列中右侧的字母。使用WHERE列出值。

SELECT RIGHT(column_name, 2) FROM table_name WHERE column_name LIKE '%[a-z][a-z]'