【问题标题】:Oracle Nested SUBSTR CompareOracle 嵌套 SUBSTR 比较
【发布时间】:2020-10-23 23:25:47
【问题描述】:

我正在尝试查询一个表,我的条件要求我将文字与列的子字符串匹配,如下所示:

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND {substr logic} = v_cik_nbr;

我的列值是这样的:“http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml”

所以,我一直在玩这样的陈述:

SELECT SUBSTR(x,1,INSTR(x,'/')-1)
FROM (SELECT SUBSTR('http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml',
              INSTR('http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml','/',1,7) +1) AS x
      FROM dual);

所以,这实际上得到了我需要比较的值:“000120767912044794”。但是,如何将其合并到 WHERE 子句中?

【问题讨论】:

  • 请以表格文本形式提供示例数据和所需结果。
  • 你的测试语句返回nulldbfiddle.uk/…

标签: oracle nested substr instr


【解决方案1】:

如果在您的示例中它应该返回 000120767912044794,那么您的 substr 就不太正确。如果您想从倒数第二个和最后一个 '/' 之间返回,那么您的内部指令需要是 instr(expression,'search',-1,2) - 从末尾开始并返回第二个匹配项。

SELECT SUBSTR(x,1,INSTR(x,'/')-1)
FROM (
SELECT SUBSTR('http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml',
              INSTR('http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml','/',-1,2) +1) AS x
FROM dual
)

要将其用作查询中的表达式,您可以将表达式复制到主子字符串中,以便可以在同一级别使用:

SUBSTR(SUBSTR(my_url,INSTR(my_url,'/',-1,2) +1),1,INSTR(SUBSTR(my_url,INSTR(my_url,'/',-1,2) +1),'/')-1)

然后你的查询

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND SUBSTR(SUBSTR(my_url,INSTR(my_url,'/',-1,2) +1),1,INSTR(SUBSTR(my_url,INSTR(my_url,'/',-1,2) +1),'/')-1) = v_cik_nbr;

或者,您也可以选择使用正则表达式:

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND regexp_substr(my_url,'.*\/([^\/]*)/[^\/]*',1,1,'i',1) = v_cik_nbr;

substr/instr 表达式可以被索引,正则表达式不能被索引(因为它可能具有不确定的行为)

【讨论】:

    【解决方案2】:

    错误的方法。

    假设您必须将像'abcdef/0123456789/blahblahblah/etc' 这样的长字符串与字符串'0123456789' 进行比较。一种方法是用SUBSTRINSTR 或正则表达式或诸如此类的东西来玩愚蠢的把戏。另一种更简单的方法是使用 FULL 字符串并将其与数字字符串进行比较,使用带有通配符的 LIKE 运算符。

    看起来像这样:

    ... where <string> LIKE '%/0123456789/%'
    

    这里%是一个通配符(代表任何字符串),/没有特殊含义。在数字字符串的两侧包含/,我们确保所需的片段不会显示为所需v_cik_number 的子字符串,而是完整的此类数字。

    在你的情况下,类似于:

    where <string> like '%/' || v_cik_number || '/%'
    

    假设v_cik_number 实际上是一个字符串 而不是数字;如果它是一个数字,您必须处理前导零,这并不难,您只需提前知道“v_cik_number”字符串的总长度应该是多少。当然,假设 v_cik_number 必须用正斜杠括起来,并且不能与 URL 的其他子字符串混淆。

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多