この「102/103/104/106」のような文字列があります
入力として 102 を渡すと、出力は 103 の次のフィールドになります。文字列を配列に分割して比較することにより、プロシージャを使用してこれを行うことができます。しかし、このようなSQLステートメントでこれを行うことはできますか
select '102/103/104/106' from dual where [expression 102 or 103].
ありがとう!!
次のようなものを使用して、純粋な 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
を使用して「次の」値を見つけます。
-- 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
/
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;