Mon relevé de mise à jour passe le long des lignes de: 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? P> 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? P> (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 p> p>
3 Réponses :
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 em> à la même valeur (texte fixe), ainsi que
Mais pour l'instant, pour votre requête spécifique, vous pouvez utiliser quelque chose comme celui-ci p>
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 i> 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 code> update code> 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 code> ne possède pas de clause code> à partir de code>, on ne peut que se référer à une valeur d'une autre table dans la clause code> définie code> 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 :)
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
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 chaqueSet code> Plus d'une autre pourExiste 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;
@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.