简体   繁体   中英

In Select: Show value only if greater than 0

I have a table with two int columns and I try the following: in the SELECT statement for the table, I will if one of this values is 0 that the column will be empty.

I have tried with this SQL but then I got 0 and not '' :

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

Table Vorpapier looks like this:

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

And the result should look like this:

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

Just use

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

and

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

you can cast to 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

Try this:-

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

OR you should change IIF to if in your sql query. Try also :-

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

In SQL, an expression returns a specific type. In this case, the type is a number, and '' is not a number. So, it is converted to one, which is where the 0 comes from.

The solution is to use compatible types. I recommend using a case expression ( case is part of standard SQL). It looks like:

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;

Alternatively, if you really want a blank string rather than NULL , then use type conversion:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM