从字符串中获取子字符串
Posted
技术标签:
【中文标题】从字符串中获取子字符串【英文标题】:To get subtring from a string 【发布时间】:2020-02-19 13:08:30 【问题描述】:我在从字符串中提取子字符串时遇到问题。 输入值是这样的
Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs
hashvalue: 233, ehdh, Resultset: 2dd34, edf, ejj
3rd value:
hashvalue: 233, ehdh, Resultset: 2dd34, Resultvalue: hsh, 23,hhs
4th value
hashvalue: 233, ehdh, Resultset:, Resultvalue: hsh, 23,hhs
5th value
Null
6th value
hashvalue: 233, ehdh, Resultvalue: hsh, 23,hhs
输出应该是这样的
Resultset: 234, edf, ejj
Resultset: 2dd34, edf, ejj
Resultset: 2dd34
Resultset:
Null
Null
Like this.
我试过了,但预期的字符串有时会先出现,有时会出现在最后。有时我会得到超出预期的字符串。
我认为,需要正则表达式来搜索两个字符,当第一个 :
出现时不要去第二个
【问题讨论】:
每个字符串是否只包含一个“Resultset:”字符串? 是的,Gary,它可能不包含,如果字符串中只包含一个结果集 【参考方案1】:您可以为此使用REGEXP_SUBSTR
。查找字符串 'Resultset' 后跟几个非逗号,然后是一个逗号,然后是几个非逗号,然后是一个逗号,然后是几个非逗号。
regexp_substr(colname, 'Resultset[^,]*,[^,]*,[^,]*')
【讨论】:
那你怎么知道停在哪里?对于Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs
,结果集是Resultset: 234
(无逗号)还是Resultset: 234, edf, ejj, Resultvalue: hsh
(3 个逗号)或其他什么?你想规定什么规则?取字符串,直到找到一个大写字符的逗号或到达字符串的末尾?或者你会如何定义规则?
它是一个以 开头的 json 列值和多个值集,例如 set1: s, d, set2: a,k,j。我们要设置 1 个值。它可以来任何顺序。它也可以在第 2 组之后出现。但列值以 开头并以 结尾
我们可以识别的每个集合何时以 : 开头
Thorsten,您的查询在雪花中有效,但结果也提取了 researchtitle 之后的所有属性。例如,输入值是,'"sport":"Ice Hockey", "researchtitle":"200217 - NBCS CA - Panthers vs. Sharks", "authentication-type":"adobe-pass", "data": "Panthers vs. Sharks (NBCS CA)|CSNCalifornia", ' 并且预期的输出是 200217 - NBCS CA - Panthers vs. Sharks 但我得到的输出是研究标题":"200217 - NBCS CA - Panthers vs. Sharks", "authentication-type":"adobe-pass", "data":"Panthers vs. Sharks (NBCS CA)|CSNCalifornia",
我得到这个字符串的 NULL,因为它甚至不包含“结果集”这个词。无论如何,我给了你我的答案,当它看起来像你想要一个“结果集”后跟一定数量的值时。由于情况并非如此,因此我的回答当然行不通。从版本 12c 开始,Oracle 中提供了 JSON 函数。您仍在使用 Oracle 11g,因此我认为尝试在该 DBMS 中处理 JSON 是一个坏主意。【参考方案2】:
返回第一个记住的“结果集:后跟任何东西(非贪婪)”组,当该组后面跟着另一个由 [逗号,然后是零个或多个空格,然后是 1 个或多个以 a 结尾的单词字符组成的组时冒号] 或 [右花括号]。
CAVEAT:如果找不到匹配项,则 REGEXP_SUBSTR() 返回 NULL。您可能希望将调用包装在 NVL() 中,然后如果值为 NULL,则返回一些内容。
编辑:更新以反映您的新测试数据。
WITH tbl(ID, str) AS (
SELECT 1, 'Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs' FROM dual UNION ALL
SELECT 2, ' hashvalue: 233, ehdh, Resultset: 2dd34, edf, ejj' FROM dual UNION ALL
SELECT 3, 'hashvalue: 233, ehdh, Resultset: 2dd34, Resultvalue: hsh, 23,hhs' FROM dual UNION ALL
SELECT 4, 'hashvalue: 233, ehdh, Resultset:, Resultvalue: hsh, 23,hhs' FROM dual UNION ALL
SELECT 5, NULL FROM dual UNION ALL
SELECT 6, 'hashvalue: 233, ehdh, Resultvalue: hsh, 23,hhs' FROM dual
)
SELECT ID,
REGEXP_SUBSTR(str, '(Resultset:.*?)(, *\w+:|)', 1, 1, 'i', 1) resultset
FROM tbl
ORDER BY ID;
ID RESULTSET
---------- ------------------------------------------------------------------
1 Resultset: 234, edf, ejj
2 Resultset: 2dd34, edf, ejj
3 Resultset: 2dd34
4 Resultset:
5
6
6 rows selected.
【讨论】:
加里,这给了第一套权利,第二套给了额外的。你能建议根据结果集找到最后一个逗号吗?请注意,第一个值结果集中出现在开始处,第二个值出现在最后。结果集也可能出现在中间。 我不明白你在问什么。请用一套完整的测试数据和执行的输出更新您的原始帖子。 我得到了你期望的输出。我更新了我的帖子以显示你的测试数据。 Gary,当我运行查询时,我得到如下结果,1.Resultset: 234, edf, ejj, Resultvalue: hsh, 23,hhs 2.Resultset: 2dd34, edf, ejj 3 .Resultset: 2dd34, Resultvalue: hsh, 23,hhs 4.Resultset:, Resultvalue: hsh, 23,hhs 5. NULL 6. NULL 它返回从resultset开始到字符串结尾的整个字符串。 我在 Oracle 12 上,但这应该仍然适用于 11g。也许其他人可以尝试并报告结果。以上是关于从字符串中获取子字符串的主要内容,如果未能解决你的问题,请参考以下文章