7
votes

Si l'instruction en ordre par clause d'une instruction SELECT dans une procédure stockée SQL Server

J'essaie de créer une procédure stockée qui prend un paramètre de bit qui si la valeur est vraie par une colonne et si des commandes fausses par une autre colonne. Comment puis-je implémenter cela?

Voici ce que j'ai jusqu'à présent xxx


0 commentaires

7 Réponses :


3
votes

Un moyen brut: xxx

Vous devriez également pouvoir utiliser cas ..Quand je pense: xxx


0 commentaires

2
votes

Je ne suis pas vraiment sûr de pouvoir? Je finirais par faire ceci: xxx


1 commentaires

Vous pouvez le faire en utilisant une déclaration de cas dans l'ordre par, mais si la requête est suffisamment complexe, votre méthode sera plus rapide.



0
votes
    SELECT
            acct_nbr,
            acct_name
    FROM
            acct
    ORDER BY case @switch when 1 then acct_name else acct_nbr end

2 commentaires

Cela ne fonctionne que lorsque Acct_nbr et ACCT_NAME ont le même type de données ou sont convertis les uns sur les autres.


Vrai, mais c'est une technique utile.



1
votes

Je pensais que vous pourriez changer le paramètre sur un int, et trier par la colonne avec cette ordinale: xxx pré>

Cela jette une belle erreur (SQL2005): P>

msg 1008, niveau 16, état 1, ligne 4 L'élément de sélection identifié par le La commande par numéro 1 contient une variable Dans le cadre de l'expression identifiant une position de colonne. Les variables sont seulement permis lors de la commande par une expression Référencer un nom de colonne. P> blockQuote>

googling autour de "A href =" http://john-sheehan.com/blog/slightly-more-dynamic-server-by-in-sql-server-n-in-sql-server-ft-in-sql-server-2005/ "rel =" nofollow NOREFERRER "> Cette solution ici (SQL 2005 et UP): P>

CREATE PROCEDURE [dbo].[CLICK10_GetCP]
    @switch AS BIT
AS
    BEGIN
        SELECT
                acct_nbr,
                acct_name
        FROM
                acct
        ORDER BY  CASE
            WHEN @switch = 0 THEN (RANK() OVER (ORDER BY acct_nbr, acct_name))
            WHEN @switch = 1 THEN (RANK() OVER (ORDER BY acct_name, acct_nbr))
         END
GO


0 commentaires

16
votes
ORDER BY
   CASE WHEN @switch = 0 THEN Field1 END,
   CASE WHEN @Switch = 1 THEN Field2 END

3 commentaires

Vous pouvez écrire ceci comme une expression de cas ... cas lorsque @ interrupteur = 0 puis champ1 lorsque vous @ interrupteur = 1 puis field2 fin


Si chaque cas a une seule clause, vous n'avez pas besoin de vous inquiéter de quel type les champs sont.


Je m'excuse, cela fonctionne en fait comme annoncé, donc +1. Ceci (commander par cas @switch quand 1 puis field1 autre champ2 fin;) ne le fait pas.



0
votes

L'approche la plus succincte est la suivante:

CREATE PROCEDURE [dbo].[CLICK10_GetCP]
    @switch AS BIT
AS
    BEGIN
        SELECT
                acct_nbr,
                acct_name
        FROM
                acct
        ORDER BY 
                case @switch
                    when 1 then acct_nbr
                    when 0 then acct_name
                end

    END
GO


0 commentaires

3
votes

Un moyen est de construire la requête quelque chose comme ceci: xxx


0 commentaires