Sql 检查最后两位数字是否按字母顺序排列

Sql 检查最后两位数字是否按字母顺序排列,sql,regex,plsql,substring,Sql,Regex,Plsql,Substring,我在表中有一列具有以下值: 部分 1000-001-2211 1000-001-2211AA 1000-001-2211AB 1000-001-2211AQ 1000-001-2211BI 如果不是数字,我需要特别显示每个值的最后两个字符。例如,我的预期输出应该如下所示: 部分|最后两个字符 1000-001-2211 | 1000-001-2211AA | AA 1000-001-2211AB | AB 1000-001-2211AQ | AQ 100

我在表中有一列具有以下值:

部分

1000-001-2211 

1000-001-2211AA

1000-001-2211AB

1000-001-2211AQ

1000-001-2211BI
如果不是数字,我需要特别显示每个值的最后两个字符。例如,我的预期输出应该如下所示:

部分|最后两个字符

1000-001-2211   |         

1000-001-2211AA | AA

1000-001-2211AB | AB

1000-001-2211AQ | AQ

1000-001-2211BI | BI

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

这应该可以。使用
RIGHT
功能从列的右侧选择字母。使用
WHERE
筛选值


从列名称类似“%[a-z][a-z]”的表名称中选择右侧(列名称,2)
使用
SUBSTR
INSTR
到编号的方法之一。因为您标记了
PLSQL

with tab as ( select '1000-001-2211AB' col1 from dual 
 union 
select '1000-001-2211' col1 from dual )
select   REGEXP_SUBSTR( col1 ,'([[:alpha:]]{2})$') last2_alpha_char  from tab;
这很有效。你能试试这个吗

首先创建一个
函数
,以验证作为参数传递的字符串

  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
测试屏幕截图:

    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

您可以使用
REGEXP\u 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]') ;
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]' ) ;
使用
SUBSTR
INSTR
REGEXP\u 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]') ;
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]' ) ;
仅使用
SUBSTR
REGEXP\u 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]') ;
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]' ) ;
输出:


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

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;
让我们创建下表:

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
在这里,funstion将帮助您获取最后两个字符


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

您是否尝试过where子句:where columnname,如“%[a-z][a-z]”?真正有助于我们帮助您的一件事是包括您尝试过的内容,还有一些示例代码没有问题。@Zahoor您可以使用iSNumeric您是否仍然需要非字母匹配才能显示在结果中,而不需要“最后两个字符”位?我只需要在输出中显示字母BAT。这是我的查询选择BOM\u标题、SAP\u CAGE\u CD、SUBSTR(BOM\u标题,-2)作为temp\u SAP\u BOM\u列表中的配置,TBITEM B,TBP部分,其中A.ITEM(+)=B.ITEM和P.ITEM=A.ITEM和BOM_标题,如“022489-054-03%”;我将获得以下输出Bom_标题代码配置022489-054-03 0 03 022489-054-03AM 99167 am 022489-054-03AQ 99167 AQ 022489-054-03AU 99167 AU 022489-054-03AY 99167 AY 022489-054-03BI 99167 BIORA-00904:“右侧”:无效标识符RACLE不提供
右侧
左侧
功能。改用
SUBSTR
<代码>右侧
相当于
SUBSTR(str,-2)
(获取字符串的最后两个字符)。
左侧
相当于
SUBSTR(str,1,2)
(获取字符串的前两个字符)。