我的代码如下:
left outer join
gme_batch_header bh
on
substr(ln.lot_number,instr(ln.lot_number,'(') + 1,
instr(ln.lot_number,')') - instr(ln.lot_number,'(') - 1)
=
bh.batch_no
它工作正常,但我遇到了一些在括号之间有两段字符串的批号。我如何比较第二组括号之间的内容?以下是批号字段中数据的示例:
E142059-307-SCRAP-(74055)
这个可以使用代码,
58LF-3-B-2-2-2 (SCRAP)-(61448)
这个尝试将SCRAP与批号no进行比较,这是不正确的。它需要是61448。
结果始终是括号中的最后一项。
答案 0 :(得分:1)
经过更多的研究,我实际上得到了它来使用这段代码:
substr(ln.lot_number,instr(ln.lot_number,'(',-1) + 1, instr(ln.lot_number,')',-1) - instr(ln.lot_number,'(',-1) - 1)
答案 1 :(得分:0)
假设SQL2005 +,并且它总是你想要的最后一次出现,那么我建议找到a的最后一个实例(在你的查询和子串中)。要获得最后一个实例,你可以使用类似的东西:
REVERSE(SUBSTRING(REVERSE(lot_number),0,CHARINDEX('(',REVERSE(lot_number))))
答案 2 :(得分:0)
如果您的Oracle版本支持正则表达式,请尝试以下操作:
substr(regexp_substr(ln.lot_number,'[0-9]+\)$'),1,length(regexp_substr(ln.lot_number,'[0-9]+\)$'))-1)
说明:
regexp_substr(scrap_row,'[0-9]+\)$' ==> find me just numbers in the string that ends in ).
这将返回数字,但它包括右括号。
要删除结束括号,只需通过子字符串发送它,然后通过字符串末尾1个字符停止的数字长度提取第一个数字。
查询分析:
with scrap
as (select '58LF-3-B-2-2-2 (SCRAP)-(61448)' as scrap_row from dual)
select scrap_row,
regexp_substr(scrap_row,'[0-9]+\)$') as regex_substring,
length(regexp_substr(scrap_row,'[0-9]+\)$')) as length_regex_substring,
substr(regexp_substr(scrap_row,'[0-9]+\)$'),1,length(regexp_substr(scrap_row,'[0-9]+\)$'))-1) as regex_sans_parenthesis
from scrap
答案 3 :(得分:0)
如果你有11g,这将通过使用regexp_substr()的子组参数并适当地构造正则表达式来实现:
SQL> with tbl(data) as
(
select 'E142059-307-SCRAP-(74055)' from dual
union
select '58LF-3-B-2-2-2 (SCRAP)-(61448)' from dual
)
select data from tbl
where regexp_substr(data, '\((\d+)\)$', 1, 1, NULL, 1)
= '61448';
DATA
------------------------------
58LF-3-B-2-2-2 (SCRAP)-(61448)
正则表达式可以理解为:
\( - Search for a literal left paren
( - Start a remembered subgroup
\d+ - followed by 1 more more digits
) - End remembered subgroup
\) - followed by a literal right paren
$ - at the end of the line.
regexp_substr函数参数是:
Source - the source string
Pattern - The regex pattern to look for
position - Position in the string to start looking for the pattern
occurrence - If the pattern occurs multiple times, which occurrence you want
match_params - See the docs, not used here
subexpression - which subexpression to use (the remembered group)
所以在英语中,查找由parens包围的一系列1个或更多数字,它出现在行的末尾并保存数字部分仅用于比较。恕我直言,比嵌套的instr(),substr()更容易遵循/维护。
为了重用,请创建一个名为get_last_number_in_parens()的函数,该函数包含此代码并使用字符串的参数进行搜索。这种方式逻辑被封装,并且可以被那些可能对正则表达式不太熟悉的人重复使用,但可以从功能中受益!一个维护代码的地方。然后这样打电话:
select data from tbl
where get_last_number_in_parens(data) = '61448';
那有多容易?!
答案 4 :(得分:0)
Hello you can check with this code. It works whaever the condition may be
SELECT SUBSTR('58LF-3-B-2-2-2-(61448)',instr('58LF-3-B-2-2-2-(61448)','(',-1)+1,LENGTH('58LF-3-B-2-2-2-(61448)')-instr('58LF-3-B-2-2-2-(61448)','(',-1)-1)
FROM dual;
SELECT SUBSTR('58LF-3-B-2-2-2 (SCRAP)-(61448)',instr('58LF-3-B-2-2-2 (SCRAP)-(61448)','(',-1)+1,LENGTH('58LF-3-B-2-2-2 (SCRAP)-(61448)')-instr('58LF-3-B-2-2-2 (SCRAP)-(61448)','(',-1)-1)
FROM dual;
Output
==================================
61448
==================================