SQL: cas lors de la déclaration avec “existe”
J'aimerais être capable de mettre en ajouter un champ qui répond à la question "Pour une valeur dans ce dossier, n'a que la valeur de répondre à une condition d'une autre table?". Je pensais essayer un case-when
avec un exists
, mais Teradata (mon sgbd) ne l'aime pas. Toutes les recommandations?
select foo,
(case when exists (select x.foo
from somedb x
where x.bar > 0)
then '1' else '0' end) as MyFlag
from mydb
Il ne vous donner une erreur de syntaxe lorsque vous exécutez? Quelle est l'erreur?
Qu'est-ce que "n'aime pas?" Quelle est l'erreur?
"3771: expression Illégale LORSQUE la clause de CAS expresssion". Voici ce que je suis en train de faire: sélectionnez t.toto, (cas 1=1 then '1' else '0' à la fin) comme lapsedFlag, (cas exists (select cc.date_dt de x.bar cc où cc.foo = t.foo et cc.date_dt entre "2010-05-01' (date) et "2010-07-31' (date) ) then '1' else '0' à la fin) comme MyFlag de x.barre de t
Qu'est-ce que "n'aime pas?" Quelle est l'erreur?
"3771: expression Illégale LORSQUE la clause de CAS expresssion". Voici ce que je suis en train de faire: sélectionnez t.toto, (cas 1=1 then '1' else '0' à la fin) comme lapsedFlag, (cas exists (select cc.date_dt de x.bar cc où cc.foo = t.foo et cc.date_dt entre "2010-05-01' (date) et "2010-07-31' (date) ) then '1' else '0' à la fin) comme MyFlag de x.barre de t
OriginalL'auteur Chris | 2010-07-28
Vous devez vous connecter pour publier un commentaire.
Il semble que vous êtes absent le
END
pour laCASE
déclaration?Bonne réponse, mais de Chris ultérieur de ce commentaire à sa question d'origine, il semble qu'il n'a inclure à la FIN dans le CAS original de la déclaration.
Yep, j'ai la FIN, là. Permettez-moi d'aller le modifier...
Je ne peux pas dire si cela fonctionne ou pas. Il est le plus upvotes, mais je ne pense pas que cette syntaxe est pris en charge dans teradata.
OriginalL'auteur martin clayton
Il y a sans doute plus d'une solution à cette question. Parfois, il y a une relation entre les deux tables. Puis-je faire une JOINTURE et de les traiter dans la clause where. Je ne sais pas Teradata, mais dans Oracle je peux aussi faire quelque chose comme cela.
ou peut-être plus comme votre code
Je sais utiliser le EXISTE seulement dans la clause where "je veux seulement que les lignes où la sélection suivante donne-moi quelque chose". Cela n'a de sens que si il y a un lien entre l'un et l'autre de la table.
Bien sûr, la veille de la solution est d'avoir deux en deux étapes: l'une avec le test "si elle existe" dans le cas où, et littéralement la définition de mon drapeau "1", et puis de le faire à nouveau avec des "si n'existe pas", littéralement le paramétrage de l'indicateur à "0". Soit dans une table temporaire ou je suppose que l'utilisation d'un syndicat...
Je ne suis pas sûr maintenant. Même si je regarde l'autre instruction SQL que vous avez ajouté un commentaire à la questions je ne sais pas pourquoi mon SQL ne serait pas résoudre le problème. Ce qui est encore nécessaire? Comme ceci:select t.toto, (cas 1=1 then '1' else '0' à la fin) comme lapsedFlag, (cas (select count(*) à partir de x.bar cc où cc.foo = t.foo et cc.date_dt entre "2010-05-01' (date) et "2010-07-31' (date) ) > 0, '1' else '0' à la fin) comme MyFlag de x.bar
OriginalL'auteur hol
Je ne pouvais pas venir avec une solution qui est facile à lire (clé lorsque vous êtes un peu simplet comme je suis), j'ai donc fait une union dans une table temporaire:
Mais maintenant je n'ai pas envie d'un mec dur 🙁
OriginalL'auteur Chris
Puisque vous n'êtes intéressé que par 1 et 0 en tant que valeurs d'indicateur, essayez les solutions suivantes:
OriginalL'auteur
N'utilisez pas de clause existe dans un cas
OriginalL'auteur Djpsiphi