В Select: Показать значение только если больше 0 - PullRequest
0 голосов
/ 21 июня 2019

У меня есть таблица с двумя столбцами типа int, и я пытаюсь сделать следующее: в операторе SELECT для таблицы, если в качестве одного из этих значений будет указано 0, столбец будет пустым.

Я пытался с этим SQL, но затем я получил 0, а не '':

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

Таблица Vorpapier выглядит так:

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

И результат должен выглядеть так:

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

Ответы [ 4 ]

3 голосов
/ 21 июня 2019

Просто используйте

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

и

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

2 голосов
/ 21 июня 2019

вы можете разыграть в Варчар.

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
1 голос
/ 21 июня 2019

В SQL выражение возвращает определенный тип. В этом случае тип является числом, а '' не является числом. Таким образом, он преобразуется в единицу, откуда 0.

Решение заключается в использовании совместимых типов. Я рекомендую использовать выражение case (case является частью стандартного SQL). Похоже:

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;

В качестве альтернативы, если вы действительно хотите пустую строку вместо NULL, используйте преобразование типа:

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;
1 голос
/ 21 июня 2019

Попробуйте: -

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

ИЛИ вам следует изменить IIF на if в вашем запросе sql.Попробуйте также: -

SELECT 
    Typ
    , Nummer
    , IF(ATBPos > 0 , ATBPos, '') AS ATBPos
    , IF(ATBStk > 0 , ATBStk, '') AS ATBStk
    , ID
FROM 
    Vorpapier
WHERE 
    FremdID = 1
    AND PosNummer = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...