Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как проверить поле на нал и больше нуля  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 520
Добрый вечер!
Есть такой селект:
SELECT (CASE WHEN ps.salary IS NULL then '' ELSE '[' + cast(ps.salary as varchar(7)) + ']' END) FROM t

тип salary - money
как ещё добавить проверку, что salary не только не Null, но ещё и >0?
13 фев 17, 19:04    [20208871]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
palladin600,

ISNULL(ps.salary,0) > 0
13 фев 17, 19:06    [20208878]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
palladin600,

ISNULL(ps.salary,0) > 0
Проще:
ps.salary>0
Мало того, такой предикат SARGable
13 фев 17, 20:45    [20209090]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Квадратные скобки для красоты должен рисовать клиент. Серверу и без того есть, чем заняться.
14 фев 17, 10:59    [20210002]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
sill98
Member

Откуда:
Сообщений: 2
palladin600,

подошел вам этот код, предложенный выше, другим пользователем?
14 фев 17, 21:09    [20211921]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
sill98,

а чё б и не подошёл, на практике в любом случае правильнее iap вариант, хотя я к нему всё равно дописываю ps.salary>0 AND ps.salary IS NOT NULL, ISNULL по большей части для вывода подходит, хотя бывают и другие случаи
15 фев 17, 12:07    [20213432]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Уголок феерической фигни
Есть такой селект:
SELECT (CASE WHEN ps.salary IS NULL then '' ELSE '[' + cast(ps.salary as varchar(7)) + ']' END) FROM t

как ещё добавить проверку, что salary не только не Null, но ещё и >0?

Во FROM - t, а в селекте ps?

Вариант 1. Изменение в базовом решении
SELECT
  CASE 
    WHEN salary IS NULL THEN ''
    WHEN salary = 0 THEN ''
    ELSE '[' + CAST( salary AS VARCHAR(7) ) + ']' 
  END
FROM
  t


Вариант 2. Правильное решение
> 7 символов маловато будет, а вдруг он больше 9'999'999 денег получает? А если еще и с дробными - то и 9'999.99 хватит. 30 в самый раз, у нас столько денег на планете пока нет.
SELECT
  CASE 
    WHEN salary > 0 THEN '[' + CAST( salary AS VARCHAR ) + ']' 
    ELSE ''
  END
FROM
  t


Вариант 3. Извращенные решения
> Ненавижу CASEы!
SELECT
  IIF( salary > 0, CONCAT( '[', salary, ']' ), '' ),
  ISNULL( NULLIF( CONCAT( '[', salary, ']' ), '[]' ), '' )
FROM
  t
15 фев 17, 12:10    [20213452]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
sill98,

а чё б и не подошёл, на практике в любом случае правильнее iap вариант, хотя я к нему всё равно дописываю ps.salary>0 AND ps.salary IS NOT NULL, ISNULL по большей части для вывода подходит, хотя бывают и другие случаи
Если в WHERE написано ps.salary>0, то это означает, что NULL тоже отбрасывается,
ибо результат выражения NULL>0 - UNKNOWN. А UNKNOWN<>TRUE.
15 фев 17, 12:13    [20213468]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
TaPaK
sill98,

а чё б и не подошёл, на практике в любом случае правильнее iap вариант, хотя я к нему всё равно дописываю ps.salary>0 AND ps.salary IS NOT NULL, ISNULL по большей части для вывода подходит, хотя бывают и другие случаи
Если в WHERE написано ps.salary>0, то это означает, что NULL тоже отбрасывается,
ибо результат выражения NULL>0 - UNKNOWN. А UNKNOWN<>TRUE.

у меня внутреннее убеждение что быстрее будет с указанием IS NOT NULL или наоборот :)
15 фев 17, 12:15    [20213478]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
o-o
Guest
Руслан Дамирович
Вариант 3.
> Ненавижу CASEы!
SELECT
  IIF( salary > 0, CONCAT( '[', salary, ']' ), '' ),
  ISNULL( NULLIF( CONCAT( '[', salary, ']' ), '[]' ), '' )
FROM
  t

более точное название: ненавижу "+"
и все сервера версии ниже 2012
15 фев 17, 12:31    [20213539]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
o-o
более точное название: ненавижу "+"
и все сервера версии ниже 2012

Старье на помойку!
15 фев 17, 12:53    [20213668]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Руслан Дамирович
o-o
более точное название: ненавижу "+"
и все сервера версии ниже 2012

Старье на помойку!

автор
IIF( salary > 0, CONCAT( '[', salary, ']' ), '' ),
ISNULL( NULLIF( CONCAT( '[', salary, ']' ), '[]' ), '' )

более тошнотворно наверное и незапишешь
15 фев 17, 13:07    [20213765]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 520
sill98,
сорри, я взял код TaPaK'a, знаю что iap плохого не посоветует, но стремануло, что он проверяет на >0, хотя в моём случае в поле же может быть Null, но может он знает что-то, типа что в БД это поле хранится как 0, независимо от того, что там Null. Просто TaPaK..., он написал первее.
15 фев 17, 14:06    [20214122]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить поле на нал и больше нуля  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
palladin600,

Значение NULL и UNKNOWN (Transact-SQL)

Мне так кажется или и в самом деле эта статья в предыдущих версиях была полнее и интереснее?

Добавлю от себя, что WHERE <ЛогическоеВыражение> пропускает в результирующий набор только строки,
для которых ЛогическоеВыражение=TRUE (а не, например, UNKNOWN).
А при проверке условия в CHECK CONSTRAINT НЕ пропускает FALSE (UNKNOWN, стало быть, пропускает).
15 фев 17, 14:26    [20214233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить