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)
(获取字符串的前两个字符)。