当字段的数据位于与要比较的字段匹配的2个字符之间时,比较字段

时间:2015-07-01 20:59:32

标签: sql oracle plsql

我的代码如下:

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。

结果始终是括号中的最后一项。

5 个答案:

答案 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
==================================