IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

ROW VALUE CONSTRUCTOR sur SELECT


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 41
    Points : 28
    Points
    28
    Par défaut ROW VALUE CONSTRUCTOR sur SELECT
    Bonjour à tous,

    Connaissez-vous le statut des rows value constructor avec ORACLE (sont-ils implémentés)?

    Exemple : une table contient 3 champs heures, minutes, secondes.
    Et je désire sélectionner les rows au dessus d'une heure déterminée (15h23s03).

    Peux-t'on réaliser le genre de select suivant?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT *
    FROM MATABLE
    WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE)  > (15, 23, 03) ? (à priori non :cry:)
     
    Suis-je obligé de générer une requête du type suivant ?
    SELECT *
    FROM T_MATABLE
    WHERE 
    MT_HEURE > 15 
    OR
    MT_HEURE = 15 AND MT_MINUTE > 23
    OR
    MT_HEURE = 15 AND MT_MINUTE = 23 AND MT_SECONDE > 03
    D'avance merci...
    Fly.

    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252

  3. #3
    Membre actif
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par cobfly Voir le message
    Bonjour à tous,
    Connaissez-vous le statut des rows value constructor avec ORACLE (sont-ils implémentés)?
    ...
    WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE) > (15, 23, 03) ? (à priori non )
    ...
    Expression list ou row value constructor pouvez utiliser seulement les comparison conditions (opérateurs =, !=, ^=, <>) ou in-conditions (in, not in).

    Votre table est mieux conçu pour avoir un champ de type date afin que

    select ... where date_column > to_date('15:23:03', 'hh24:mi:ss')

    Ce n'est pas seulement pour des raisons pratiques mais aussi pour le calcul des coûts du CBO et donc de l'optimisation SQL.

    Yong Huang

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par yong321 Voir le message
    Expression list ou row value constructor pouvez utiliser seulement les comparison conditions (opérateurs =, !=, ^=, <>) ou in-conditions (in, not in).

    Votre table est mieux conçu pour avoir un champ de type date afin que

    select ... where date_column > to_date('15:23:03', 'hh24:mi:ss')

    Ce n'est pas seulement pour des raisons pratiques mais aussi pour le calcul des coûts du CBO et donc de l'optimisation SQL.

    Yong Huang
    Le problème est identique avec l'opérateur =
    par exemple
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MATABLE WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE) = (15, 23, 03);
    me donne une erreur ORA-00920

    L'exemple donné incluait effectivement une date. Je trouvai l'exemple plus parlant ainsi.
    Mais il s'agit en fait d'une question générale.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez pas bien lu le lien de mnitu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With MaTable AS
    (
    select 1 id, '15' h, '23' m, '03' s from dual union all
    select 2   , '15'  , '22'  , '59'   from dual
    )
    select *
      from MaTable
     where (h, m, s) = (('15', '23', '03'));
     
    ID	H	M	S
    1	15	23	03

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous n'avez pas bien lu le lien de mnitu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With MaTable AS
    (
    select 1 id, '15' h, '23' m, '03' s from dual union all
    select 2   , '15'  , '22'  , '59'   from dual
    )
    select *
      from MaTable
     where (h, m, s) = (('15', '23', '03'));
     
    ID	H	M	S
    1	15	23	03
    Oups Désolé, les parenthèses me manquent ....
    Pour l'instant je génère les clauses WHERE avec les tests sur chacun des cas.
    En espérant dans un futur proche, l'intégration de cette fonctionnalité un peu plus SQL92..

    Merci.

  7. #7
    Membre actif
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par cobfly Voir le message
    Le problème est identique avec l'opérateur =
    par exemple
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MATABLE WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE) = (15, 23, 03);
    me donne une erreur ORA-00920
    SELECT * FROM MATABLE WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE) = (select 15, 23, 03 from dual);

    J'ai oublié de dire que expression-list exige une sous-requête (sub-query), pas une in-list.

    Néanmoins, je pense toujours que vous avez besoin pour créer la table d'avoir un champ de type date. Un index range scan sera mieux optimisé.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par yong321 Voir le message
    J'ai oublié de dire que expression-list exige une sous-requête (sub-query), pas une in-list.
    Je ne pense pas que ce soit vrai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With MaTable AS
    (
    select 1 id, '15' h, '23' m, '03' s from dual union all
    select 2   , '15'  , '22'  , '59'   from dual union all
    select 3   , '16'  , '23'  , '03'   from dual
    )
    select *
      from MaTable
     where (h, m, s) in (('15', '23', '03'), ('15', '22', '59'));
     
    ID	H	M	S
    1	15	23	03
    2	15	22	59

  9. #9
    Membre actif
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je ne pense pas que ce soit vrai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With MaTable AS
    (
    select 1 id, '15' h, '23' m, '03' s from dual union all
    select 2   , '15'  , '22'  , '59'   from dual union all
    select 3   , '16'  , '23'  , '03'   from dual
    )
    select *
      from MaTable
     where (h, m, s) in (('15', '23', '03'), ('15', '22', '59'));
     
    ID	H	M	S
    1	15	23	03
    2	15	22	59
    C'est intéressant. Mais apparemment cette expression list

    (h, m, s) in (('15', '23', '03'), ('15', '22', '59'));

    n'est pas utilisée comme un expression list. Plutôt il est utilisé comme une single expression, comme dans le cas de
    column_name in ('value1', 'value2')

    Mais peut-être nous pouvons ouvrir un SR de demander à Oracle. Le diagramme à
    http://download.oracle.com/docs/cd/E...ditions013.htm
    n'est pas claire.

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par yong321 Voir le message
    ...Mais peut-être nous pouvons ouvrir un SR de demander à Oracle. Le diagramme à
    http://download.oracle.com/docs/cd/E...ditions013.htm
    n'est pas claire.
    Que est-ce que vous ne trouvez pas claire dans cette diagramme ? Pour moi elle corresponde bien à l'example fourni.

  11. #11
    Membre actif
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Que est-ce que vous ne trouvez pas claire dans cette diagramme ? Pour moi elle corresponde bien à l'example fourni.
    C'est difficile pour moi d'utiliser le diagramme pour expliquer pourquoi cette expression list ne fonctionne pas:

    WHERE (MT_HEURE, MT_MINUTE, MT_SECONDE) in (15, 23, 03);

  12. #12
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    La première paire de parenthèse est ici.
    { expr [ NOT ] IN ({ expression_list | subquery })
    | ( expr [, expr ]... )
    [ NOT ] IN ({ expression_list [, expression_list ]...
    | subquery
    }
    )
    }
    La deuxième est ici
    { expr [, expr ]...
    | ( [expr [, expr ]] ...)}
    Et le texte indique qu’il faut utiliser la version d’en bas de diagramme expresion list
    If you use the upper form of the in_condition condition (with a single expression to the left of the operator), then you must use the upper form of expression_list. If you use the lower form of this condition (with multiple expressions to the left of the operator), then you must use the lower form of expression_list, and the expressions in each expression_list must match in number and data type the expressions to the left of the operator. You can specify up to 1000 expressions in expression_list.

Discussions similaires

  1. Utilisation du Row Value Constructor
    Par Antoun dans le forum SQL
    Réponses: 7
    Dernier message: 31/07/2007, 16h20
  2. [value d'un select]
    Par reltim dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/11/2004, 14h21
  3. Déclenchement sur select
    Par sdinot dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 02/04/2004, 11h52
  4. Trigger sur select
    Par bilo2000 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/02/2004, 13h39
  5. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo