1
votes

Dans Sélectionner: afficher la valeur uniquement si elle est supérieure à 0

J'ai une table avec deux colonnes int et j'essaye ce qui suit: dans l'instruction SELECT pour la table, je vais si l'une de ces valeurs est 0 que la colonne sera vide.

J'ai essayé avec ce SQL mais ensuite j'ai eu 0 et pas '':

Nummer (varchar) | ATBPos (int) | ATbStk (int) | Typ (varchar)
-----------------+--------------+--------------+--------------
54542542542      |              |              | OHNE
45454            | 15           | 45           | ATB

Table Vorpapier ressemble à ceci:

Nummer (varchar) | ATBPos (int) | ATbStk (int) | Typ (varchar)
-----------------+--------------+--------------+--------------
54542542542      | 0            | 0            | OHNE
45454            | 15           | 45           | ATB

Et le résultat devrait ressembler à ceci:

SELECT 
    Typ
    , Nummer
    , IIF(ATBPos > 0 , ATBPos, '') AS ATBPos
    , IIF(ATBStk > 0 , ATBStk, '') AS ATBStk
    , ID
FROM 
    Vorpapier
WHERE 
    FremdID = 1
    AND PosNummer = 1


5 commentaires

quel est votre DB?


DB est: MS SQL 11.0


Je me demande s'il existe des valeurs entières négatives pour les colonnes ATBPos et / ou ATbStk?


Cela dépend du TIP, seulement si Tyo est ATB alors ces deux valeurs sont supérieures à 0 sinon elles sont 0


Le problème, au cas où vous vous poseriez encore la question, est que votre résultat «» est converti en int car le premier type de données de résultat est int. Le cast d'une chaîne vide en int donne la valeur 0.


4 Réponses :


3
votes

Utilisez simplement

iif (ATBPos = 0, null, ATBPos) comme ATBPos

et

iif (ATBStk = 0, null, ATBStk) comme ATBStk


4 commentaires

J'ai eu une erreur: SQL (102) Syntaxe incorrecte près de "AT Pos". Pensez que c'est parce que dans la colonne int ne peut pas être Null


@ Zam89 veuillez jeter un oeil à petite démo nous ne changeons pas la structure du tableau, mais juste le style d'affichage .


Vous avez raison, j'ai une erreur de frappe dans mon SQL, désolé pour ça


@ Zam89 pas important :)



1
votes

Essayez ceci: -

SELECT 
    Typ
    , Nummer
    , IF(ATBPos > 0 , ATBPos, '') AS ATBPos
    , IF(ATBStk > 0 , ATBStk, '') AS ATBStk
    , ID
FROM 
    Vorpapier
WHERE 
    FremdID = 1
    AND PosNummer = 1

OU vous devriez changer IIF en if dans votre requête SQL. Essayez aussi: -

SELECT 
    Typ
    , Nummer
    , (CASE WHEN ATBPos > 0 then  ATBPos ELSE '' END)  as ATBPos 
    , (CASE WHEN ATBStk > 0 then  ATBStk ELSE '' END)  as ATBStk 
    , ID
FROM 
    Vorpapier
WHERE 
    FremdID = 1
    AND PosNummer = 1


0 commentaires

2
votes

vous pouvez diffuser en varchar.

SELECT 
    Typ
    , Nummer
    , IIF(ATBPos > 0 , cast(ATBPos as varchar), '') AS ATBPos
    , IIF(ATBStk > 0 , cast(ATBStk as varchar), '') AS ATBStk
    , ID
FROM 
    Vorpapier
WHERE 
    FremdID = 1
    AND PosNummer = 1


0 commentaires

2
votes

En SQL, une expression renvoie un type spécifique. Dans ce cas, le type est un nombre et '' n'est pas un nombre. Donc, il est converti en un, d'où vient le 0 .

La solution est d'utiliser des types compatibles. Je recommande d'utiliser une expression case ( case fait partie du SQL standard). Cela ressemble à:

SELECT Typ, Nummer,
       (CASE WHEN ATBPos > 0 THEN CAST(ATBPos as VARCHAR(255)) ELSE '' END) AS ATBPos,
       (CASE WHEN ATBStk > 0 THEN CAST(ATBStk as VARCHAR(255)) ELSE '' END) AS ATBStk, ID
FROM Vorpapier
WHERE FremdID = 1 AND
      PosNummer = 1;

Sinon, si vous voulez vraiment une chaîne vide plutôt que NULL , utilisez la conversion de type:

SELECT Typ, Nummer,
       (CASE WHEN ATBPos > 0 THEN ATBPos END) AS ATBPos,
       (CASE WHEN ATBStk > 0 THEN ATBStk END) AS ATBStk, ID
FROM Vorpapier
WHERE FremdID = 1 AND
      PosNummer = 1;


0 commentaires