Основываясь на книге Селко, вот что я нашел и хорошо работает!
SELECT
TABLE1.ID
, MAX(SEQ1.SEQ) AS START_POS
, SEQ2.SEQ AS END_POS
, COUNT(SEQ2.SEQ) AS PLACE
FROM
TABLE1, V_SEQ SEQ1, V_SEQ SEQ2
WHERE
SUBSTR(',' || TABLE1.VALUE || ',', SEQ1.SEQ, 1) = ','
AND SUBSTR(',' || TABLE1.VALUE || ',', SEQ2.SEQ, 1) = ','
AND SEQ1.SEQ < SEQ2.SEQ
AND SEQ2.SEQ <= LENGTH(TABLE1.VALUE)
GROUP BY TABLE1.ID, TABLE1.VALUE, SEQ2.SEQ
Где V_SEQ статическая таблица с одним полем:
SEQ, integer values 1 through N, where N >= MAX_LENGTH(VALUE).
Это основано на самом деле ЗНАЧЕНИЕ обернут «» на обоих концах, как это:
,A,B,C,D,
Если ваши жетоны фиксированной длины (как в моем случае), я просто использовал поле PLACE для вычисления фактической строки.Если переменная длина, использование start_pos и end_pos
Итак, в моем случае, жетоны 2 гольца долго, поэтому окончательный SQL является:
SELECT
TABLE1.ID
, SUBSTR(TABLE1.VALUE, T_SUB.PLACE * 3 - 2 , 2) AS SINGLE_VAL
FROM
(
SELECT
TABLE1.ID
, MAX(SEQ1.SEQ) AS START_POS
, SEQ2.SEQ AS END_POS
, COUNT(SEQ2.SEQ) AS PLACE
FROM
TABLE1, V_SEQ SEQ1, V_SEQ SEQ2
WHERE
SUBSTR(',' || TABLE1.VALUE || ',', SEQ1.SEQ, 1) = ','
AND SUBSTR(',' || TABLE1.VALUE || ',', SEQ2.SEQ, 1) = ','
AND SEQ1.SEQ < SEQ2.SEQ
AND SEQ2.SEQ <= LENGTH(TABLE1.VALUE)
GROUP BY TABLE1.ID, TABLE1.VALUE, SEQ2.SEQ
) T_SUB
INNER JOIN
TABLE1 ON TABLE1.ID = T_SUB.ID
ORDER BY TABLE1.ID, T_SUB.PLACE
Слайк-решение Rob. Я считаю, что «модель» трудно понять, поэтому я никогда не обращу внимания на первое. Хорошее сообщение в блоге тоже. – APC
+1 и принято - очень круто! Это более общее решение, чем у моего – IMHO
. Это работает для оракула 9? –