0

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

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 子句中?

4

2 回答 2

0

错误的做法。

假设您必须将长字符串 like'abcdef/0123456789/blahblahblah/etc'与 string进行比较'0123456789'SUBSTR一种方法是使用andINSTR或正则表达式或诸如此类的东西来玩愚蠢的把戏。另一种更简单的方法是使用 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 的其他一些子字符串混淆。

于 2020-10-24T01:02:54.537 回答
0

如果在您的示例中它应该返回 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 表达式可以被索引,正则表达式不能被索引(因为它可能具有不确定的行为)

于 2020-10-23T23:39:53.010 回答