De la table :
| name | range |
------------------------
| 'Range1' | '456-458' |
| 'Range2' | '11-13' |
J'essaie juste d'obtenir ce résultat :
| name | range | value |
--------------------------------
| 'Range1' | '456-458' | 456 |
| 'Range1' | '456-458' | 457 |
| 'Range1' | '456-458' | 458 |
| 'Range2' | '11-13' | 11 |
| 'Range2' | '11-13' | 12 |
| 'Range2' | '11-13' | 13 |
J'ai fait la requête qui fonctionne bien si la table source n'a qu'une seule plage :
WITH data AS (
SELECT 'Range1' name, '456-458' range FROM dual
)
SELECT ROWNUM, name, range, LEVEL value
FROM data, dual
WHERE LEVEL >= to_number(SUBSTR(range, 1, INSTR(range,'-')-1))
CONNECT BY LEVEL <= to_number(SUBSTR(range, INSTR(range,'-')+1));
mais renvoie des dizaines de milliers de lignes, si elle prend deux plages :
WITH data AS (
SELECT 'Range1' name, '456-458' range FROM dual
UNION
SELECT 'Range2' name, '11-13' range FROM dual
)
SELECT ROWNUM, name, range, LEVEL value FROM data, dual
WHERE LEVEL >= to_number(SUBSTR(range, 1, INSTR(range,'-')-1))
CONNECT BY LEVEL <= to_number(SUBSTR(range, INSTR(range,'-')+1));
Est-il possible d'améliorer cette requête pour obtenir le résultat souhaité, ou bien mon approche initiale est erronée ?
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production