我在表格中有一个列,其中包含以下值:
部分
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查询获取此输出?
答案 0 :(得分:1)
使用SUBSTR
,INSTR
和TO_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
测试屏幕截图:
答案 1 :(得分:1)
您可以使用REGEXP_LIKE
将SUBSTR
,INSTR
与REGEXP_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]') ;
仅使用SUBSTR
和REGEXP_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]' ) ;
输出
答案 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]'