-3
votes

Signe de comparaison "supérieur à" et "égal à" dans l'affaire SQL relevé

Je suis nouveau sur SQL Server et c'est mon premier message.
Je reçois le message "Syntaxe incorrecte près de" = "lors de l'utilisation de l'instruction CASE. Voici un exemple de mon code:

  Select * , CASE 
    when a > b THEN b = a
    when c > d THEN d = c
    when e > f THEN f = e
    when g > h THEN h = g
    when i > j THEN j = i
    when k > l THEN l = k
    when m > n THEN n = m
    when o > p THEN p = o

END as value
INTO #temptable
From #atemptable


4 commentaires

Bonjour Msab2, pouvez-vous d'abord expliquer ce que vous essayez de faire?


J'essaie d'évaluer une expression où il vérifie si une variable est supérieure à celle de l'autre. S'il est alors défini, la variable inférieure égale à la plus grande variable. Avoir un sens? Est-ce que cela répond à votre question? Il s'agit du code existant dans une autre langue (SAS) que j'essaie de refaire dans SQL.


Heh, je peux lire ce genre de, mais vous ne pouvez pas le faire dans une déclaration de sélection. Il n'existe que pour sélectionner des choses. Pas d'attribution ou de chose possible, c'est ce que vous avez la déclaration de mise à jour.


D'accord. Merci tt. Je vais examiner la déclaration de mise à jour.


3 Réponses :


1
votes

Ce n'est pas clair si vous voulez que le puis code> une apparcription ou une comparaison. De toute façon, ce n'est pas possible, la partie code> ne peut être qu'une expression. Je suppose que vous vouliez une mission. Il semble que vous ne voulez pas mettre à jour le #atestable code>, vous voulez juste que les nouvelles valeurs dans #temptable code>. Dans ce cas, vous pouvez utiliser des expressions code> distinctes CODE>, comme ceci:

SELECT  A, CASE WHEN A > B THEN A ELSE B END AS B,
        C, CASE WHEN C > D THEN C ELSE D END AS D
END AS value
INTO #temptable
FROM #atemptable


7 commentaires

Pedantic Plongez dans la documentation: une comparaison, par exemple PI> = E , est un Expression avec un type de données de résultat de Boolean . Comme la documentation indique: "Contrairement à d'autres types de données SQL Server, un type de données Boolean ne peut pas être spécifié comme type de données d'une colonne de table ou d'une variable, et ne peut pas être retourné dans un ensemble de résultats." ...


... Pour compléter le cycle de la documentation pour case offre:" Expression de résultat est une expression valide. " Ainsi, une expression de résultat peut être une comparaison sur l'égalité, mais il ne peut pas être renvoyé que le type de données booléen ne peut pas être renvoyé, mais c'est une "expression valide", mais non valide dans ce contexte. Où est le "tirant des cheveux" Emoji?


Eh bien, il semblerait que Sélectionnez 1 dans la cas où 1 = 1 = 1 = 0 autre 1 = 1 extrémité devrait fonctionner, mais ce n'est pas le cas. 😕


Il serait presque sembler comme ça. Le problème est que "un type de données booléen ne peut pas être spécifié comme type de données d'une colonne de table ou d'une variable et ne peut pas être renvoyé dans un ensemble de résultats". Si cela pourrait alors SELECT 1> 0; fonctionnerait car un Sélectionner la liste peut contenir une expression. Puisque vous pouvez créer des expressions boolean , mais ne peut jamais contenir sur une valeur boolean , il fait que la documentation sonne comme un argument sur ce que "est".


Dans mon commentaire précédent, je n'ai pas essayé de Retour A expression boolean , j'essayais de l'utiliser dans le condition.


A clause Expression de recherche ne peut pas être un sans d'autres pièces / pièces, par exemple une comparaison avec un autre , donc ... en cas de fin de compte; ne serait pas valide. Essayer de votre déclaration entraîne toujours une erreur dans la clause (code> puisque depuis la valeur de retour de l'affaire expression ne peut pas être un booléen , un problème Que mon deuxième commentaire ne donne pas clair en citant l'évangile selon Microsoft. (J'ai maintenant une calvitie Microsoft Motif.)


@Habo, merci à vous deux pour vos commentaires. Je travaille toujours sur cette question et fournira une mise à jour bientôt.



1
votes

Non seulement vous avez besoin d'une instruction de mise à jour comme TT a écrit dans les commentaires, vous ne pouvez pas également utiliser des expressions de cas comme contrôle de flux.

Une expression de cas renvoie une valeur basée sur la condition (s). Une opération à l'intérieur du puis code> une partie d'une expression de cas n'est valide que lorsqu'elle renvoie une valeur. P>

Vous recherchez probablement quelque chose comme ceci: P>

UPDATE #temptable
SET B = CASE A > B Than A ELSE B END
   ,D = IIF(C > D, C, D) -- IIF is syntactic sugar for simple case expressions
 -- more of the same for all other columns


1 commentaires

Merci pour votre avis. Je travaille toujours pour résoudre ce problème. Je vais fournir une mise à jour une fois que tout est résolu.



1
votes

1 commentaires

Merci pour votre avis. Je travaille toujours sur cette question et déterminera si ce que vous avez présenté fonctionnera. Je vous tiendrai au courant.