Oracle嵌套SUBSTR比较

Oracle嵌套SUBSTR比较,oracle,nested,substr,instr,Oracle,Nested,Substr,Instr,我试图查询一个表,我的条件要求我将文本与列的子字符串匹配,如下所示: SELECT ......... FROM issuer_table WHERE owner = "ABC" AND {substr logic} = v_cik_nbr; SELECT SUBSTR(x,1,INSTR(x,'/')-1) FROM (SELECT SUBSTR('http://www.url.com/data/Archives/931015/000120767912044794/d

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

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND {substr logic} = v_cik_nbr;
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);
... where <string> LIKE '%/0123456789/%'
我的列值如下所示:http://www.url.com/data/Archives/931015/000120767912044794/doc4.xml"

所以,我一直在玩弄这样的说法:

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND {substr logic} = v_cik_nbr;
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);
... where <string> LIKE '%/0123456789/%'

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

如果在您的示例中substr应该返回000120767912044794,那么它就不太正确。如果您想从倒数第二个和倒数第二个“/”之间返回,那么您的内部instr需要是instr(表达式,'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(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;
或者,您可以点击并使用regexp:

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND regexp_substr(my_url,'.*\/([^\/]*)/[^\/]*',1,1,'i',1) = v_cik_nbr;
substr/instr表达式可以被索引,regexp表达式不能被索引(因为它可能具有非确定性行为)

错误的方法

假设您必须将一个长字符串(如
'abcdef/0123456789/blahblahblah/etc')
与字符串
'0123456789'
进行比较。一种方法是用
SUBSTR
INSTR
或正则表达式之类的东西玩愚蠢的把戏。另一种更简单的方法是使用带有通配符的
LIKE
运算符,使用完整字符串并将其与数字字符串进行比较

它看起来是这样的:

SELECT .........
FROM issuer_table
WHERE owner = "ABC"
  AND {substr logic} = v_cik_nbr;
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);
... where <string> LIKE '%/0123456789/%'

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

请以表格文本形式提供示例数据和所需结果。测试语句返回
null