10
votes

SQL - Mise à jour avec une déclaration de cas, dois-je répéter le même cas plusieurs fois?

Mon relevé de mise à jour passe le long des lignes de: XXX

Les travaux ci-dessus. Il vérifie essentiellement si un champ d'une autre table est null ou non, puis met à jour le "nom de famille" du client et "Middlename" en conséquence. Comme vous pouvez le voir ci-dessus, j'ai répété la même déclaration de cas deux fois. Ma question est: est-ce que je peux spécifier l'énoncé de cas juste une fois?

Le point est que, si je disait à mettre à jour 10 champs basés sur une certaine condition, dois-je inclure 10 cas similaires conditions? Ou le SQL peut-il être amélioré pour avoir un seul cas, et 10 mises à jour sur le terrain dans les clauses quand / else?

(J'utilise une base de données PostgreSQL 8.2, mais je crois que ce qui précède est standard SQL). < / p>

Merci beaucoup, Rishi


0 commentaires

3 Réponses :


3
votes

Si vous vouliez effectuer l'affaire sur le même niveau de requête, vous devriez répéter le boîtier, comme vous le répéteriez une colonne calculée dans un groupe par clause.

Votre requête ne révèle pas du tout quoi Vous voulez faire, vous mettez-vous vraiment la mise à jour tous les enregistrements à la même valeur (texte fixe), ainsi que toutes les colonnes par enregistrement. Si vous avez mis à jour pour rendre la question plus pertinente, il y a probablement une meilleure réponse.


Mais pour l'instant, pour votre requête spécifique, vous pouvez utiliser quelque chose comme celui-ci xxx


11 commentaires

Pas vraiment la meilleure solution Richard. Comme votre sélection Sélectionneure analyse la table et ajoute le résultat et après cela le filtre.


@Duumitcucu Bogdan / Je ne pense pas que ça fait ça. Parce que PostgreSQL déroulera la requête pour appliquer les filtres dans la sous-requête, mais conservera toujours la possibilité d'utiliser la colonne définie (calculée).


La syntaxe de l'OP n'est pas standard SQL (notez également que la norme SQL est internationale et le "A" dans "ANSI" signifie "SQL conforme à l'American" afin que "ISO conformant SQL" serait plus approprié ici :)


Ceci serait certainement la façon logique de la gérer. Bien que je ne l'ai jamais invoqué. Malheureusement, je n'ai malheureusement pas un serveur PSQL disponible pour pouvoir voir ce comportement en réalité.


@Duumitcucu Bogdan / je le fais, et je l'ai testé. Expliquez clairement le montre clairement que cela devrait.


@Richard aka Cyberkiwi: "Pouvez-vous s'il vous plaît élaborer sur quelle partie n'est pas standard?" - L'instruction update L'op utilisé n'est pas standard SQL. Comment puis-je le dire d'une autre manière? Il est structuré d'une manière qui n'est pas syntaxe valide? Par exemple, la norme update ne possède pas de clause à partir de , on ne peut que se référer à une valeur d'une autre table dans la clause définie en utilisant un Subquier scalaire, qui ne laisse pas beaucoup de syntaxe valide.


@RICHARD AKA CYBERKIWI: "Trouvez-moi quelques principaux sites / papiers" - Allez à Wikipedia, recherchez "SQL-92", accédez aux deux chantiers / papiers référencés (la spécification en clairexuel et le BNF respectivement) que je crois être Les deux principales références pour la norme SQL-92. Remarque pour les deux s'appelle "ISO / IEC" et n'utilisez pas "ANSI".


Vous avez dit: "Trouve-moi des sites / papiers majeurs" et je pense que j'ai fait. Je ne cherchais pas un argument. Si le texte réel de la norme n'est pas suffisamment la preuve pour vous, je ne peux rien prouver. S'il vous plaît noter mon commentaire original était entre parenthèses (c'est-à-dire pas BIGGIE) et inclus un smiley :)


"Pas de biggie" signifie "pas grave"


:) signifie "s'il vous plaît ne prenez pas ça trop sérieusement"


Je vois que vous avez supprimé votre erreur antérieure ("C'est ce que vous devez faire à l'aide de SQL ANSI / ISO-conformiant"), donc j'ai supprimé mon bowvote :)



0
votes

Si vous avez besoin de copier le cas exact plus de fois (beaucoup plus que 2), vous pouvez utiliser la requête suivante. Mais vous devez vraiment avoir besoin de copier le cas, pas avec le test et le test2 (ce n'est pas exactement le même cas). De toute évidence, si vous avez besoin de concaténer le texte comme test / test 2 ou quoi que ce soit pour obtenir un résultat, vous pouvez le faire dans l'instruction SELECT. Ex: Nom de famille = 'Test' + ST.RESULT, il existe donc certaines possibilités de faire des "hacks".

UPDATE  customer
SET  forenames=ot.forenames,
     surname = st.result,
     middlename = st.result

FROM    order_transaction ot
JOIN (select 1 as ID,'test SAFEPLACE IS NULL' as result 
      union
      select 2,'test SAFEPLACE IS NULL') st on case when ot.safeplace is null then 1 else 2 end = st.id

WHERE   customer.custid = ot.custid
AND ot.trans_orderid = 5678
AND customer.custid = 1234


0 commentaires

9
votes

Je crois que ce qui précède est standard SQL P>

En fait, ce n'est pas le cas. SQL standard n'a pas de update..from code> syntaxe. Plutôt, vous devez utiliser une sous-requête scalaire pour chaque Set code> Plus d'une autre pour Existe code>, de sorte que la syntaxe standard est encore plus répétitive par exemple. P>

MERGE INTO customer
   USING (
          SELECT ot.custid, ot.forenames, 
                 CASE 
                     WHEN ot.safeplace IS NULL 
                        THEN 'test SAFEPLACE IS NULL'
                     ELSE 'test Safeplace IS NOT NULL'
                  END
             FROM order_transaction AS ot
            WHERE ot.trans_orderid = 5678   
         ) AS source (custid, forenames, safeplace_narrative)
   ON customer.custid = source.custid
      AND customer.custid = 1234
WHEN MATCHED THEN
   UPDATE 
      SET forenames = source.forenames, 
          surname = source.safeplace_narrative, 
          middlename = source.safeplace_narrative;


1 commentaires

@RICHARD AKA CYBERKIWI: Réponse mise à jour Pour ajouter un exemple de fusion pour montrer qu'il est plus compact tout en restant standard SQL.