如何解决Oracle Nested SUBSTR比较
我正在尝试查询表,而我的标准要求我将文字与列的子字符串进行匹配,如下所示:
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','/',7) +1) AS x
FROM dual);
因此,这实际上为我提供了需要比较的值:“ 000120767912044794”。但是,如何将其合并到WHERE子句中?
解决方法
如果您的示例中应返回000120767912044794,则您的substr不太正确。如果要从倒数第二个和最后一个'/'之间返回,则您的内部instr必须为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(SUBSTR(my_url,INSTR(my_url,2) +1),INSTR(SUBSTR(my_url,'/')-1)
然后进行查询
SELECT .........
FROM issuer_table
WHERE owner = "ABC"
AND SUBSTR(SUBSTR(my_url,'/')-1) = v_cik_nbr;
或者,您也可以点击并使用regexp:
SELECT .........
FROM issuer_table
WHERE owner = "ABC"
AND regexp_substr(my_url,'.*\/([^\/]*)/[^\/]*','i',1) = v_cik_nbr;
substr / instr表达式可以被索引,而正则表达式不能被索引(因为它可以具有不确定性)
,错误的方法。
假设您必须将长字符串'abcdef/0123456789/blahblahblah/etc'
与字符串'0123456789'
进行比较。一种方法是使用SUBSTR
和INSTR
或正则表达式或其他方法来玩一些愚蠢的把戏。另一种更简单的方法是使用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的其他子字符串混淆。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。