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

MS SQL Server Discussion :

Peut-on appliquer une fonction sur un champs ajouté?


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut Peut-on appliquer une fonction sur un champs ajouté?
    Bonjour tout le monde!

    Désolé pour l'intitulé pas très clair mais je m'embrouille un peu...

    Voilà je voulais savoir s'il était possible avec sql server d'avoir une requête de ce type :

    SELECT SUM(id1+id2) as SOMME, CAST( SOMME AS CHAR) AS CHAINE

    C'est un exemple, juste pour expliquer le principe.

    En fait est-ce qu'il est possible d'appliquer une fonction à un champs qu'on a 'créé' (ici SOMME)

    J'ai essayé mais ça ne fonctionne pas et comme je suis débutante en sql server , je voulais déja savoir si c possible

    J'espère que vous m'avez comprise.
    Merci!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 85
    Points : 92
    Points
    92
    Par défaut
    essai de passer par une table temporaire....

  3. #3
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    salut,

    passe simplement la valeur de retour de ta fonction à l'autre fonction. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CAST(SUM(id1+id2) AS varchar(20)) AS CHAINE

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    Oui c'est ce que je pensais faire si c'était impossible .
    Je voulais en fait éviter de devoir refaire une table ou une requête , c'est redondant car la 2è table sera pareille à la 1ère mé avec un champs en plus...

    Bon, je vais faire ça alors...
    Merci !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    oups javé pas vu ta rep rudib,je répondais à phoenix1998...

    Rudib ta solution est bonne sauf que mon exemple était pour simplifier.

    En fait voici le premier champs sur lekel je veux appliquer une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CASE WHEN isdate(durée) = 1 THEN Durée 
    WHEN (dbo.Qualifications.Durée LIKE '1 an' OR
    dbo.Qualifications.Durée LIKE '[Aa][Nn][Nn][Uu][Ee][Ll]' OR
     dbo.Qualifications.Durée LIKE '[Aa][Nn][Nn][Uu][Ee][Ll][Ll][Ee]') 
    THEN cast(CONVERT(varchar(10), dateadd(year, 1, date), 3) AS char) 
    WHEN (Durée LIKE '[2-9] ans') 
    THEN cast(CONVERT(varchar(10), dateadd(year, cast(substring(Durée, 1, 1) AS int), date), 3) AS char) 
    ELSE '0' END
     AS Fin

    un peu long...

    Je veux appliquer une fonction à Fin

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Si tu n'es pas dans une collation case sensitive, ton like n'est pas utile... bon, il y a de grands problèmes de normalisation ici. Faisons avec. Un LIKE 'annuel%' devrait remplacer tes deux LIKE pour la durée, si tu es en collation case insensitive (c'est-à-dire la plupart du temps). Sinon tu peux faire un LOWER(Durée) LIKE 'annuel%' pour mettre l'opérande de gauche en minuscules. A éviter dans une clause WHERE pour raisons de performances, mais dans un CASE du SELECT ça devrait être ok.

    Si tu veux ne pas faire le tout deux fois, tu peux faire une sous requête comme ceci (pseudo-code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT somme, cast(somme as varchar(10))
    FROM (SELECT CASE ... END as somme FROM ta_table) t
    J'espère que ça n'agit pas sur un grand nombre de lignes.

    En plus, pourquoi veux-tu caster la même valeur dans une autre colonne. Ne peux-tu pas gérer ça dans le programme appelant, s'il y en a un ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    Merci de tes conseils pour la durée!

    C vrai ça n'est pas très optimisé (dès qu'il y a une suite de like suivi de OR...)
    donc je l'ai corrigé merci mais pour la fonction voici exactement ce que je veux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT {Toute la partie CASE-END} AS Fin, 
    CASE WHEN isdate(fin) = 1 
    THEN cast(datediff(month, getdate(), Fin) AS char) 
     ELSE '-9999' END AS NBMOIS
    Je ne vois pas ce que tu entends par
    En plus, pourquoi veux-tu caster la même valeur dans une autre colonne. Ne peux-tu pas gérer ça dans le programme appelant, s'il y en a un ?
    à+

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    là je pars en vacances ! alors je vais laisser les autres prendre le relais. En tout cas, par rapport à ce que tu veux faire (c'est beaucoup de logique dans un pauvre SELECT, mais bon), essaie avec la sous-requête comme proposé dans mon précédent message. qqch comme ceci (toujours du pseudo-code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT
    CASE WHEN isdate(t.fin) = 1 
    THEN cast(datediff(month, getdate(), t.Fin) AS char) 
     ELSE '-9999' END AS NBMOIS 
    FROM (SELECT {Toute la partie CASE-END} AS Fin) t

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/07/2011, 13h39
  2. [AJAX] appliquer une fonction sur un lien précis
    Par bzakaria dans le forum AJAX
    Réponses: 2
    Dernier message: 30/06/2010, 18h45
  3. peut on filtrer une table sur deux champs
    Par lila23 dans le forum Débuter
    Réponses: 3
    Dernier message: 20/04/2009, 18h48
  4. Réponses: 9
    Dernier message: 09/06/2008, 16h59
  5. [MySQL] Appliquer une fonction sur un champ lors d'une requête
    Par Jérémy197 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/08/2006, 14h29

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