【问题标题】:how to use REGEXP_SUBSTR or INSTR in Oracle SQL to get specific string from a column that varies in character length如何在 Oracle SQL 中使用 REGEXP_SUBSTR 或 INSTR 从字符长度不同的列中获取特定字符串
【发布时间】:2021-08-12 19:00:59
【问题描述】:

我在 oracle 数据库表中存储了以下值:column name=org 并且我正在尝试获取 org.在这种情况下,用户属于:'abc'、'xyz',即 DC= 之后的第一次出现。我怎样才能做到这一点?

12~OU=Administrators,DC=abc,DC=enter,DC=msft,DC=com

14~OU=Admin,OU=Users,DC=xyz,DC=enter,DC=msft,DC=com

输出

abc

xyz

我对 regex_substr、instr 表达式很陌生。

我们将不胜感激。

提前致谢。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我会建议类似regexp_substr(col, '(,|^)DC=([^,]*)(,|$)', 1, 1, '', 2)

    (,|^)DC= 位将匹配,DC= 或后跟DC= 的行首(因此它不会匹配另一个名称,例如ANOTHERDC=)。 ([^,]*) 位将匹配非逗号字符(取决于您是否需要处理字段中的转义分隔符,您可能需要更改此设置)。表达式末尾的(,|$) 匹配逗号或行尾(以确保我们选择了整个段......但见下文)。将第 4 个参数设置为 1 可确保我们获得第一个匹配项。第6个参数设置为2表示我们只想返回第二个()内匹配的部分。

    由于默认情况下匹配将是贪婪的,因此您不必担心(,|$) 位,只需使用regexp_substr(col, '(,|^)DC=([^,]*)', 1, 1, '', 2)。我指定它是因为我认为对于不记得它默认为贪婪还是非贪婪的人(比如我)来说更清楚。

    同样,如果您知道不需要担心非 DC 名称以 DC 结尾的情况,您可以简化为 regexp_substr(col, 'DC=([^,]*)', 1, 1, '', 1)

    您可以从这样的内容开始,然后根据您的要求对其进行修改。

    【讨论】:

    • 谢谢@EdmCoff。我用这个 regexp_substr(col, 'DC=([^,]*)', 1, 1, 'i', 1) 来获得不区分大小写的匹配——以覆盖 dc=DC= )下面的 2 个表达式为 OU=Administrators,dc=abc,DC=enter,DC=msft,DC=c 返回相同的值.什么是差异? regexp_substr(col, '(,|^)DC=([^,]*)', 1, 1, 'i', 2) regexp_substr(col, 'DC=([^,]*)', 1, 1, 'i', 1) 请您帮我理解您评论的这一部分: ([^,]*) 位将匹配非逗号字符(取决于您是否需要在您的字段中处理转义分隔符,您可能将需要更改)
    • 如果没有其他以 dc 结尾的列,这两个正则表达式是相同的。如果您有字符串 'NOTDC=1,DC=2' 第一个将返回 2,但第二个将返回 1(因为 NOTDC= 包含 DC= 并且它不检查行首或逗号之前)。
    • 我对转义分隔符的评论是关于您是否有办法在值中包含逗号。我不知道你的字符串的格式,但我猜你可能有办法在值中包含逗号。例如OUT=blah,DC=A\,B,OU=blah 可能意味着“A,B”是值。如果您需要处理类似的事情,则需要更改正则表达式,以便它不会将反斜杠逗号视为正则逗号。当然,如果您知道值中不能有逗号字符,则无需进行任何处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多