0

この「102/103/104/106」のような文字列があります

入力として 102 を渡すと、出力は 103 の次のフィールドになります。文字列を配列に分割して比較することにより、プロシージャを使用してこれを行うことができます。しかし、このようなSQLステートメントでこれを行うことはできますか

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

ありがとう!!

4

3 に答える 3

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 に答える
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 に答える
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 に答える