8
votes

Déclaration de cas dans SQL en utilisant comme

Bonjour j'ai une déclaration SQL

INSERT INTO Foundation.TaxLiability.EmpowerSystemCalendarCode

SELECT SystemTax.SystemTaxID,
       EmpowerCalendarCode.CalendarCodeID
      ,CASE WHEN  EmpowerCalendarCode.CalendarName LIKE '%Monthly%' THEN 3
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Annual%' THEN 2
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Quarterly%' THEN 4
       ELSE 0
       END
       FROM Foundation.Common.SystemTax SystemTax, Foundation.TaxLiability.EmpowerCalendarCode EmpowerCalendarCode
WHERE SystemTax.EmpowerTaxCode = EmpowerCalendarCode.LongAgencyCode and SystemTax.EmpowerTaxType = EmpowerCalendarCode.EmpowerTaxType


6 commentaires

Que montre-t-il si vous supprimez la première ligne (le insérer dans ... )?


Comment savez-vous que les rangées avec 0 ne sont pas déjà dans la table? Je remarque que vous n'avez pas vraiment d'où les clauses autres que les critères de jointure (c'est pourquoi il est souvent préférable d'utiliser une jointure intérieure explicite au lieu de la table à l'ancienne, des jointures de table). Je suggère d'identifier ces lignes avec un choix et de quitter la table de destination pour le moment.


Je suis d'accord avec @ypercube, que si vous retirez l'insert dans et remplacez la réécriture de la sélection avec Sélectionnez SystemTax.Systemtaxid, EMPOWERCALENDARCODE.CALENDARCODEID, EMPOWERCALENDARCODE.CALENDNAME . Votre déclaration de cas a l'air d'être correcte, alors il doit y avoir quelque chose dans votre endroit où cela lance des choses.


Selon @ypercube, mais aussi Sélectionnez EMPOWERCALENDARCODE.CALENDNAME Juste pour voir ce que vous obtenez (c.-à-d. Peut-être que la jointure n'est pas bonne et c'est tout NULLS, etc.)


Essayez de renvoyer la valeur de colonne EmPowerCalendar.calendarcode ainsi que l'instruction CASE et exécutez la requête uniquement (sans l'insert). Cela devrait s'assurer que la valeur calendronnée est ce que vous pensez.


Donc, si vous ajoutez EmPowerCalendarcode.calendarname à votre liste Sélectionner, vous pouvez voir "trimestriel (EOM)" de la même ligne que 0?


3 Réponses :


10
votes

Pour un, je voudrais mettre à jour votre SQL à cela afin que vous utilisiez un joindre sur votre instruction sur votre au lieu de la placer dans un Clause. xxx

deux, que se passe-t-il si vous supprimez le insérer dans ?


3 commentaires

@bluefeet: C'est la fin de la journée et mes yeux sont fatigués. Je comprends le changement de syntaxe que vous avez fait, mais je ne comprends pas comment il est fonctionnellement différent. Qu'est-ce que je ne vois pas?


Je ne suis pas convaincu d'un changement fonctionnel "corrigé" le problème. Je suppose que l'OP a apporté d'autres modifications au code (ou nettoyé de mauvaises données, ou les deux) en plus du changement de syntaxe.


@Aaron Bertrand a accepté, je ne pense pas que cela soit "corrigé" le problème non plus. Je venais d'offrir une meilleure façon d'écrire la requête sans utiliser une clause où



0
votes
  1. Essayez de gouverner tous les problèmes nuls avec isnull ():
  2. Essayez de décider de tout problème de sensibilité de cas avec Upper ():

    cas lorsque la tige (isnull (empruntcalendarcode.calendarname, «aucun»)) aime '% mensuel%' puis 3 ...


0 commentaires

1
votes

Vous pouvez aussi faire comme ça. Je pense que cela fonctionnera. XXX


0 commentaires