0

我有一个像这样的字符串 '102/103/104/106'

现在,如果我将 102 作为输入传递,那么输出应该是下一个字段,即 103。如果是 103,那么输出应该是 104,如果是 106,那么输出应该是 null(至于最后一个字段,我没有任何进一步的表达)。我可以通过将字符串拆分为数组并进行比较来使用过程来做到这一点。但是我可以通过这样的sql语句来做到这一点吗

select '102/103/104/106' from dual where [expression 102 or 103].

谢谢!!

4

3 回答 3

2
-- p_whole_string = '102/103/104/106'
-- p_prev = '102'
select 
  regexp_substr(p_whole_string, '(^|/)' || p_prev || '/([^/]+)', 1, 1, null, 2) 
  as next
from dual;

如果输入 106,则添加 NVL 以返回最后一个值:

SELECT NVL(REGEXP_SUBSTR('102/103/104/106', '(^|/)' || '106' || '/([^/]+)', 1, 1, null, 2), REGEXP_SUBSTR('102/103/104/106', '[^/]+$')) as nxt
  FROM dual
/
于 2013-03-05T12:51:28.410 回答
2

您可以在纯 SQL 中使用以下内容执行此操作:

--convert your string into rows
with vals as (
select
       substr('102/103/104/106', 
              instr('102/103/104/106', '/', 1, level)-3, 
              3
             ) col,
       level lvl
from dual
connect by level <= length('102/103/104/106')-length(replace('102/103/104/106', '/'))+1
)
select * 
from   (
select col, 
       lead(col) over (order by lvl) next_val -- find the next value in the list 
from   vals
)
where  col = :val;

基本上,通过解析将字符串转换为行。然后使用解析lead找到“下一个”值。

于 2013-03-05T13:01:14.617 回答
1

适用于 Oracle 表格 10 以上。

SELECT 
REGEXP_SUBSTR(
  REGEXP_SUBSTR('102/103/104/106', '(^|/)102/[^/]+'), -- returns 102/103
  '[^/]+',1,2) val -- takes second part
FROM DUAL;

带参数看起来像这样:

-- p_string_to_search = '102/103/104/106'
-- p_string_to_match = '102'

SELECT 
REGEXP_SUBSTR(
  REGEXP_SUBSTR(p_string_to_search, '(^|/)' || p_string_to_match ||'/[^/]+'), -- returns 102/103
  '[^/]+',1,2) val -- takes second part
FROM DUAL;
于 2013-03-05T13:08:53.417 回答