【发布时间】:2023-03-22 07:35:01
【问题描述】:
如何从 oracle sql 中的帐户列中删除前 3 个和后 5 个字符?
我有一个专栏帐户。 示例帐号“99k9220000709999” 结果应显示帐号为“92200007”。 需要oracle sql查询。有人可以建议吗?
【问题讨论】:
如何从 oracle sql 中的帐户列中删除前 3 个和后 5 个字符?
我有一个专栏帐户。 示例帐号“99k9220000709999” 结果应显示帐号为“92200007”。 需要oracle sql查询。有人可以建议吗?
【问题讨论】:
substr 应该可以解决问题 - 您从位置 4 开始,将列的长度减去 5+3=8:
SELECT SUBSTR(mycolumn, 4, LENGTH(mycolumn) - 8)
FROM mytable
【讨论】:
另一种方法将部分左修剪到字母结束的字符,然后提取没有最后五个字符的剩余字符串
WITH t(str) AS
(
SELECT '99k9220000709999' FROM DUAL
), t2 AS
(
SELECT regexp_substr(str,'[^[:alpha:]]+$') as str
FROM t
)
SELECT substr( str,1, length(str)-5 ) as "Result"
FROM t2
【讨论】:
您可以使用substr() 和length()。另一种方法是使用正则表达式:
select regexp_replace('99k9220000709999', '^.{3}(.*).{5}$', '\1')
from dual;
但不一定是最有效的方法。
【讨论】:
^.{0,3}(.*?).{0,5}$ db<>fiddle
如果我们可以让它变得复杂(为了好玩),为什么要让它变得简单?
SQL> with test (id, account) as
2 (select 1, '99k9220000709999' from dual union all
3 select 2, '002LF004828xx' from dual
4 ),
5 split as
6 (select id,
7 column_value lvl,
8 regexp_substr(account, '[^.]', 1, column_value) chr,
9 max(length(account)) over (order by null) len
10 from test cross join table(cast(multiset(select level from dual
11 connect by level <= length(account)
12 ) as sys.odcinumberlist))
13 )
14 select id,
15 listagg(chr, '') within group (order by lvl) result
16 from split
17 where lvl between 4 and len - 5
18 group by id;
ID RESULT
---------- --------------------
1 92200007
2 LF004828
SQL>
【讨论】: