提问人:Amol Salunke 提问时间:11/3/2023 最后编辑:Joel CoehoornAmol Salunke 更新时间:11/11/2023 访问量:100
SQL 中的字符串剪切
String cut in SQL
问:
我需要使用 SQL 从以下字符串中仅提取 or:YES
NO
'5^hgf^A^6^YES@1^g' 'H^jfd^k^i^NO@2^ojg'
到目前为止,我尝试了这个正则表达式:
Regexp(column_name,[^^|],1,4)
我们需要介于 和 之间的字符,特别是 和 。@
^
YES
NO
我该怎么做?
答:
1赞
Littlefoot
11/3/2023
#1
如果真实数据真的看起来像你发布的样本数据,那么它就是你要找的第5个“词”。在这种情况下,这可能会:
with test (col) as
(select '5^hgf^A^6^YES@1^g' from dual union all
select 'H^jfd^k^i^NO@2^ojg' from dual
)
select col,
regexp_substr(col, '\w+', 1, 5) result_1,
substr(col, instr(col, '^', 1, 4) + 1,
instr(col, '@') - instr(col, '^', 1, 4) - 1
) result_2
from test;
result_1
使用正则表达式,看起来更漂亮result_2
使用组合,提取第 4 个字符和substr + instr
^
@
看看小提琴。
1赞
d r
11/4/2023
#2
一种选择是将字符串的长度与字符串的长度进行比较,如果存在,则删除 YES/NO......
WITH
tbl AS -- S a m p l e D a t a :
( Select '5^hgf^A^6^YES@1^g' "TXT" From Dual Union All
Select 'H^jfd^k^i^NO@2^ojg' "TXT" From Dual Union All
Select '5^hgf^A^6^YES@1^g^NO@' "TXT" From Dual Union All
Select 'H^jfd^k^i^XX@2^ojg' "TXT" From Dual
)
-- M a i n S Q L :
Select TXT, Case When Length(TXT) > Length(Replace(TXT, '^YES@')) And Length(TXT) > Length(Replace(TXT, '^NO@')) Then 'YES_NO'
When Length(TXT) > Length(Replace(TXT, '^YES@')) Then 'YES'
When Length(TXT) > Length(Replace(TXT, '^NO@')) Then 'NO'
Else 'None'
End "FLAG"
From tbl
/* R e s u l t :
TXT FLAG
--------------------- ------
5^hgf^A^6^YES@1^g YES
H^jfd^k^i^NO@2^ojg NO
5^hgf^A^6^YES@1^g^NO@ YES_NO
H^jfd^k^i^XX@2^ojg None */
评论
0赞
Koen Lostrie
11/4/2023
为什么不直接使用 INSTR 呢?相同的逻辑,更少的代码还是我遗漏了什么?
0赞
d r
11/4/2023
@KoenLostrie您没有遗漏任何东西,这只是比正则表达式更快的选项之一。把它的标题的原因 - 字符串剪...
0赞
user_stack_overflow
11/5/2023
#3
这是您问题的最佳答案:
select output from (Select Rownum r, 'YES' as output
From dual
Connect By Rownum <=(SELECT REGEXP_COUNT ('5^hYESgf^A^6^YES@1^g''H^jfd^k^i^NO@2^ojg', 'YES')
FROM dual)
union
Select Rownum r, 'NO' as output
From dual
Connect By Rownum <=(SELECT REGEXP_COUNT ('5^hYESgf^A^6^YES@1^g''H^jfd^k^i^NO@2^ojg', 'NO')
FROM dual))
;
0赞
Reilas
11/11/2023
#4
请尝试以下捕获模式。
(?:.+?\^){4}([^@]+)
评论
case when col_name like '%YES@%' then 'YES' else 'NO' end
REGEXP_SUBSTR()。
正则表达式应该用引号括起来,而不是方括号。REGEXP()
”YES”
”NO”
”^”