Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2011, 10h52   #1
Membre à l'essai
 
Inscription : février 2009
Messages : 102
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 102
Points : 21
Points : 21
Par défaut CASE POUR UN 'IN'

bonjour à tous,

j'essai du faire un truc du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
SELECT * FROM ...
 
WHERE .... IN ( CASE
 
 
             WHEN ...... = 'T'  THEN 'TEST'
             WHEN ...... = 'A'  THEN 'TEST','ACCP'
             WHEN ...... = 'P'  THEN 'TEST','ACCP','PROD'
 
 
                  ) END
je ne sais pas si c'est possible et surtout je ne sais pas comment m'y prendre.

Merci
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 15h15   #2
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 42
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : janvier 2008
Messages : 42
Points : 35
Points : 35
Par défaut CASE POUR UN 'IN'

Peut être avec cette syntaxe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT * FROM ...
WHERE RUB1  IN (          
CASE RUB2                 
WHEN 'T' THEN 'TEST'   
WHEN 'A' THEN 'TEST'   
WHEN 'P' THEN 'TEST'   
END,                      
CASE RUB2                 
WHEN 'A' THEN 'ACCP'   
WHEN 'P' THEN 'ACCP'   
END,                      
CASE RUB2                 
WHEN 'P' THEN 'PROD'   
END )
battistuta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/01/2011, 15h31   #3
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Ta demande n'est pas très claire. Ne veux-tu pas plutôt établir la requête suivante ?

Code :
1
2
3
4
5
6
7
SELECT CASE MaZone 
                When 'T' Then 'TEST'
                When 'A' Then 'ACCP'
                When 'P' Then 'PROD'
                Else MaZone 
            END
WHERE MaZone IN ('TEST', 'ACCP', 'PROD')
Sinon, explique ce que tu veux faire.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 09h15   #4
Membre à l'essai
 
Inscription : février 2009
Messages : 102
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 102
Points : 21
Points : 21
bonjour,

Non C'est plus dans l'optique de la réponse de battistuta.
Mais je n'ai pas encore eu le temps d'essayer, ce sera pour lundi.


merci
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 10h17   #5
Membre à l'essai
 
Inscription : février 2009
Messages : 102
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 102
Points : 21
Points : 21
Merci battistuta !!! ca fonctionne impeccablement.
djmic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 13h17   #6
Membre actif
 
Inscription : juin 2008
Messages : 146
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : juin 2008
Messages : 146
Points : 183
Points : 183
Bonjour,

Gaffe aux perfs. Avec la solution du CASE, tu pars en scan de la table. S'il est est volumineuse... Des fois, il faut savoir faire simple :

Code :
1
2
3
4
5
6
SELECT ...
FROM TAB
WHERE (COL1 = 'X' AND COL2 = 0)
OR (COL1 = 'Y' AND COL2 = 1)
OR (COL1 = 'Z' AND COL2 = 2)
OR ...
Ou alors

Code :
1
2
3
4
5
6
SELECT ...
FROM TAB
WHERE (COL1, COL2) = ('X', 0)
OR (COL1, COL2) = ('Y', 1)
OR (COL1, COL2) = ('Z', 2)
OR...
Avec ces 2 écritures, s'il existe un index sur COL1 ou COL2, voire les 2 colonnes, DB2 se servira de cet index en Multiple Access Index, tu n'auras donc aucun souci de perf.
pdz74 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/01/2011, 17h28   #7
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 42
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : janvier 2008
Messages : 42
Points : 35
Points : 35
Par défaut CASE POUR UN 'IN'

Bien vu le montagnard
Sur des rubriques indexés et une table volumineuse, on a tout à gagner avec un bon vieux OR...
battistuta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 18h10   #8
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 502
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 502
Points : 687
Points : 687
Bonjour

Juste une remarque.
En utilisant le OR, il y a des chances d'avoir un TableScan.
Et plus il y a de OR, plus la probabilité d'avoir un TableScan augmente.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/01/2011, 19h34   #9
Membre actif
 
Inscription : juin 2008
Messages : 146
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : juin 2008
Messages : 146
Points : 183
Points : 183
Tout à fait d'accord avec Bernard59139, le OR est souvent mal interprété par DB2 en terme de chemins d'accès. Ceci dit, avec le CASE, le scan est une certitude. Avec le OR, on a des chances d'être OK.

J'ai fait 2 ou 3 essais tout à l'heure sur une table de plusieurs millions de lignes avec une dizaine de OR : réponse dans la seconde. Avec le CASE, réponse en plusieurs minutes...

Y'a pas photo !

Je profite du message pour passer le bonjour à l'homme du sud alias Battistuta. Préviens si tu viens dans la région, on a beau dire, le ski c'est quand même plus de sensations que DB2...
pdz74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 12h01   #10
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 502
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 502
Points : 687
Points : 687
Bonjour

Je viens de lire la doc. Le " col1 IN (CASE ...." n'est ni indexable, ni stage 1.
==> le tablescan sera très consommateur de ressources.

A l'inverse, la même requête avec des "OR" bien codés, sera STAGE1, même si les index ne sont pas utilisés.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/01/2011, 00h35   #11
Membre chevronné
 
Avatar de Peut-êtreUneRéponse
 
Homme Guillaume VENTRE
z/OS Technical Leader
Inscription : décembre 2006
Messages : 514
Détails du profil
Informations personnelles :
Nom : Homme Guillaume VENTRE
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : z/OS Technical Leader
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2006
Messages : 514
Points : 617
Points : 617
Le OR fait diminuer le nombre de matchcols s'il porte sur une/des colonnes indexables si je ne m'abuse (tout comme un BETWEEN)

.
__________________
★★ Documentation Mainframe par Guillaume Ventre ★★
Peut-êtreUneRéponse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 23h26   #12
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par pdz74 Voir le message
Tout à fait d'accord avec Bernard59139, le OR est souvent mal interprété par DB2 en terme de chemins d'accès. Ceci dit, avec le CASE, le scan est une certitude. Avec le OR, on a des chances d'être OK.
Pourquoi mal interprété ?

Db2 ne fera de scan table que s'il estime que les clauses OR vont permettre de ramener plus de 20% des lignes de la table en question.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h37.


 
 
 
 
Partenaires

Hébergement Web