2
votes

Renvoyer des valeurs séparées par des virgules dans SQL Server dans un élément

J'ai la requête ci-dessous que j'utilise pour renvoyer le résultat séparé par des virgules.

SELECT STUFF
(
    (
        SELECT ',' + em.EMAIL 
        FROM(
            SELECT  DISTINCT USR.EMAIL AS EMAIL
          FROM PRNCPLS A, PRNCPLS B, USER_INFO USR,
          RELATIONSHIPS C
          WHERE A.ID = C.PARENTID 
          AND B.ID = C.CHILDID
          AND A.TYPE = 'USER' and B.TYPE = 'ROLE'
          AND A.ID = USR.ID
          and B.NAME = 'Approver'
          AND USR.EMAIL IS NOT NULL) em
        ORDER BY em.EMAIL FOR XML PATH('')
    ),
     1, 1, ''
) AS Output

Je dois mettre à jour cette requête de manière à ce que la première ligne de l'instruction SQL (et pas la sortie) commencez toujours comme ceci

SELECT EMAIL FROM

Ceci est nécessaire car l'outil que j'utilise pour une raison quelconque attend FROM dans la première ligne et un seul élément dans la clause SELECT . Ma requête ne renvoie en fait qu'un seul élément, donc j'espérais le mettre à jour d'une manière ou d'une autre.

Résultat attendu - abcd @ gmail.com, 1234 @ yahoo.com, xyz @ gmail.com

Toute aide serait appréciée.


3 commentaires

Tout d'abord, gardez à l'esprit qu'il s'agit d'une manière obsolète d'écrire des jointures: , vous devez commencer à convertir en INNER JOIN way


Mauvaises habitudes à prendre: en utilisant des JOINs à l'ancienne


Donc, pour le moment, vous obtenez un seul champ contenant des valeurs séparées par des virgules, mais vous souhaitez ajouter «SELECT EMAIL FROM» devant lui, est-ce correct? Ou voulez-vous également diviser la liste séparée par des virgules d'une manière ou d'une autre?


4 Réponses :


2
votes

avez-vous essayé

SELECT 'SELECT EMAIL FROM ' + STUFF
(
    (
        SELECT ',' + em.EMAIL 
        FROM(
            SELECT  DISTINCT USR.EMAIL AS EMAIL
          FROM PRNCPLS A, PRNCPLS B, USER_INFO USR,
          RELATIONSHIPS C
          WHERE A.ID = C.PARENTID 
          AND B.ID = C.CHILDID
          AND A.TYPE = 'USER' and B.TYPE = 'ROLE'
          AND A.ID = USR.ID
          and B.NAME = 'Approver'
          AND USR.EMAIL IS NOT NULL) em
        ORDER BY em.EMAIL FOR XML PATH('')
    ),
     1, 1, ''
) AS Output;

ou y a-t-il d'autres informations sur le formatage des données?


3 commentaires

Je pense que l'OP ne recherche pas SELECT EMAIL FROM , mais plutôt un certain format pour articuler la requête ...


@Cato Merci pour votre réponse, mais inclut également le texte SELECT EMAIL FROM dans la sortie malheureusement.


Sortie attendue - abcd @ gmail.com, 1234 @ yahoo.com, xyz @ gmail.com



0
votes

Vous pouvez encapsuler presque n'importe quel SELECT comme ceci:

SELECT t.SomeColumn FROM
(
     place your existing SELECT here
) t;

Cela ne fonctionnerait pas avec une requête CTE, mais les CTE peuvent être eux-mêmes transformés en sous-requêtes .

Astuce : essayez d'éviter les jointures à l'ancienne si possible. Il y a un bon lien fourni par Sami dans les commentaires ...


3 commentaires

Salut Shnugo, merci pour la réponse. J'ai mis à jour ma requête pour utiliser les JOIN. J'ai modifié la requête comme vous l'avez mentionné, mais cela ne fonctionne pas. Y a-t-il autre chose que je pourrais essayer?


@Newbie que veut dire mais ça ne marche pas ? Veuillez fournir plus de détails


malheureusement, changer les jointures avec la méthode moderne ne modifiera pas réellement la sortie. De plus, il est possible qu'il n'y ait pas de gain de performance.



2
votes

Avez-vous essayé de faire

SELECT 'SELECT EMAIL FROM '
UNION
... Your existing query


0 commentaires

2
votes
SELECT EMAIL FROM (

SELECT STUFF
(
    (
        SELECT ',' + em.EMAIL 
        FROM(
            SELECT  DISTINCT USR.EMAIL AS EMAIL
          FROM PRNCPLS A, PRNCPLS B, USER_INFO USR,
          RELATIONSHIPS C
          WHERE A.ID = C.PARENTID 
          AND B.ID = C.CHILDID
          AND A.TYPE = 'USER' and B.TYPE = 'ROLE'
          AND A.ID = USR.ID
          and B.NAME = 'Approver'
          AND USR.EMAIL IS NOT NULL) em
        ORDER BY em.EMAIL FOR XML PATH('')
    ),
     1, 1, '') AS EMAIL
) AS Output
Beware of both "...EMAIL...":
"SELECT EMAIL ..." 
"...1,1,'') AS EMAIL...".

2 commentaires

Merci beaucoup Grimm, c'est exactement ce dont j'avais besoin.


Salut @Newbie, je suis heureux que vous ayez trouvé une solution. Juste pour mentionner ceci: c'est exactement la même chose que ma réponse. C'est un SELECT où la requête existante est encapsulée en sous-requête ...