SQL 中的字符串剪切

String cut in SQL

提问人:Amol Salunke 提问时间:11/3/2023 最后编辑:Joel CoehoornAmol Salunke 更新时间:11/11/2023 访问量:100

问:

我需要使用 SQL 从以下字符串中仅提取 or:YESNO

'5^hgf^A^6^YES@1^g'
'H^jfd^k^i^NO@2^ojg'

到目前为止,我尝试了这个正则表达式:

Regexp(column_name,[^^|],1,4)

我们需要介于 和 之间的字符,特别是 和 。@^YESNO

我该怎么做?

SQL 正则表达式 数据库 Oracle 子字符串

评论

1赞 ΩmegaMan 11/3/2023
您是否正在处理特定的数据库?这可能与数据库使用的正则表达式解析器有关。如果是这样,请将其添加为标记。
0赞 Amol Salunke 11/3/2023
我们正在开发 Oracle 数据库。
4赞 Isolated 11/3/2023
作为替代方法,可以使用大小写表达式,例如case when col_name like '%YES@%' then 'YES' else 'NO' end
0赞 Barmar 11/3/2023
我在 Oracle 手册中没有看到任何功能;我认为您正在寻找的函数是 REGEXP_SUBSTR()。正则表达式应该用引号括起来,而不是方括号。REGEXP()
0赞 Cary Swoveland 11/4/2023
而不是“我们需要 @ 和 ^ 之间的字符,特别是 YES 和 NO”,听起来您的目标是提取字符串或提供它前面和后面是 '“@”'”。”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}([^@]+)