2009-05-18 8 views
2

Je cherche le meilleur moyen de sélectionner des nombres directement à partir d'une clause in.Oracle Sélectionner des nombres à partir d'une clause IN

essentiellement comme:

 
SELECT * FROM (2,6,1,8); 

qui ne fonctionne pas. Je peux le faire de cette façon:

 
SELECT Lv FROM ( SELECT Level LV 
        FROM DUAL 
        CONNECT BY Level < 20) 
WHERE Lv IN (2,6,1,8); 

Mais cela semble être un peu maladroit. Y a-t-il une manière plus élégante?

+0

Y at-il un problème particulier que vous essayez de résoudre en faisant cela? – mmorrisson

+0

Ce sont vraiment des exécutions uniques pl/sql. Générer des boucles sur certains nombres et autres. –

Répondre

1

Il est plus élégant si vous matérialisez une table de numéros auxiliaire:

SELECT num FROM numbers WHERE num IN (2,6,1,8); 

Et ceci est également utile lorsqu'il est combiné avec une autre table.

Par exemple, j'ai eu un cas où je devais remplir de grandes tables de configuration avec les changements des résultats de morceaux:

feuille Big SP ou Excel ou d'un rapport identifie les centres de coûts manquants dans la configuration donne un grand ensemble de résultats qui doivent être insérés avec des données variables dans certains groupes.

Coller des résultats partiels dans une virgule individuels séparés listes:

INSERT INTO {stuff} 
SELECT {stuff}, 130 as line_item 
FROM numbers 
WHERE numbers.num IN ({pasted a section of results}) 

INSERT INTO {stuff} 
SELECT {stuff}, 135 as line_item 
FROM numbers 
WHERE numbers.num IN ({pasted another section of results}) 
+0

Excellente idée. J'ai déjà utilisé RowNum avec ALL_OBJECTS auparavant, mais cela ne me semble pas normal. –

+0

Quelle est l'utilisation de la table des nombres ici? Ne pourrait-on pas simplement écrire "FROM {grosse construction} WHERE cost_center dans ({selection of results})"? – Andomar

+0

Désolé, c'était un mauvais exemple. Je vais le corriger. –

0

Si vous n'avez pas besoin explicitement la clause IN, vous pouvez utiliser UNION:

select 2 from dual 
    union 
    select 6 from dual 
    union 
    select 1 from dual 
    union 
    select 8 from dual 

Il existe une variante plus élégante pour insérer plusieurs lignes dans une table:

INSERT ALL 
    INTO table (col) VALUES ('a') 
    INTO table (col) VALUES ('b') 
    INTO table (col) VALUES ('c') 
SELECT * FROM dual; 

Mais je Je ne sais pas un moyen de le faire pour un SELECT.

3

Vous pouvez faire

select column_value from table(sys.dbms_debug_vc2coll(1,2,3,4,5)); 

mais qui retourne en fait un varchar2. Vous pouvez créer votre propre TYPE et l'utiliser

create type tab_num is table of number; 
/
select column_value from table(tab_num(1,2,3,4,5)); 

Il est également intéressant de consulter la clause MODEL. Il semble compliqué, mais il est très bon pour générer des données

SELECT x from dual 
MODEL DIMENSION BY (1 AS z) MEASURES (1 x) 
    RULES ITERATE (7) (x[ITERATION_NUMBER]=ITERATION_NUMBER+1) 
Questions connexes