2014-02-12 3 views
0

У меня есть следующая таблицаSQL запросов - работа с нулевым значением

Name Amount Paid 
----------------------- 
Ali  500 500 
Baba  700 100 
Cam  300 Null 
Dave  Null Null 

Я хочу, чтобы следующий желаемый результат:

Name Amount Paid 
-------------------- 
Baba  700 100 
Cam  300 Null 

Я написал следующий SQL запрос, но он не работал

SELECT Name, Amount, Paid 
FROM Table_1 
WHERE PAID <> AMOUNT 
+0

Что вы получили? Ошибка или какой-то результат отличается от ожидаемого? –

ответ

1

Будет ли это работать, если вы относитесь к NULL в ноль (при условии, что это действительная бизнес-логика):

SELECT Name, ISNULL(Amount,0), ISNULL(Paid,0) as Paid 
FROM Table_1 
WHERE ISNULL(Paid,0) <> ISNULL(Amount,0) 
+0

Это приведет к недействительному результату, когда 'Paid' равен нулю, а' Amount' - 'NULL' или наоборот. – dasblinkenlight

+0

@dasblinkenlight, поэтому моя начальная строка, спрашивающая, могут ли NULLs рассматриваться как нули, прояснили начальную строку моего ответа, чтобы сделать это более понятным. – Tanner

1

Ну, null <> null is null, и null = null также null, что приводит к ложному состоянию. Смешение?

Вы должны проверить нуль отдельно, используя is null оператор:

select 
Name, Amount, Paid 
from Table_1 
where 
(Paid is not null and Amount is not null and Paid <> Amount) 
or 
not (Paid is null and Amount is null); 

Или, в некоторых случаях, вы можете легко использовать

coalesce(Paid, 0) <> coalesce(Amount, 0) 
+1

False! Результат 'null <> null' не является ложным, это значение null –

+0

@JakubKania Это ложное условие в предложении where. MS SQL не имеет true или false. – Luaan

+0

Но все же это null не false. Если вы собираетесь использовать его как часть другого опыта, например 'NOT null <> null, вы все равно получите null. Предложение where не соответствует действительности, о котором мы могли бы договориться. –

1

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

SELECT Name, Amount, Paid 
FROM  Table_1 
WHERE ISNULL(PAID,0) <> ISNULL(AMOUNT,0) 
+0

Это приведет к недействительному результату, когда 'Paid' равен нулю, а' Amount' - 'NULL' или наоборот. – dasblinkenlight

+0

Правильно, я полагаю, что он никогда не будет вставлять 0/нулевой комбо. Спасибо, что узнали. – JiggsJedi

1

ВЫБРАТЬ Имя, Сумма, ISNULL (Paid, 0), как Paid ОТ Table_1
ГДЕ ISNULL (Paid, 0) <> СУММА

+0

Это приведет к недопустимому результату, когда 'Paid' равен NULL, а' Amount' не 'NULL'. – dasblinkenlight

1

NULL означает неизвестное, так dmbs не может сказать, что 300 <> NULL. Используйте Coalesce (col, 0), когда NULL означает ноль:

SELECT Name, Amount, Paid 
FROM Table_1 
WHERE COALESCE(PAID,0) <> COALESCE(AMOUNT,0) 
+0

Это приведет к недопустимому результату, когда 'Paid' равен нулю, а' Amount' - 'NULL' или наоборот. – dasblinkenlight

+0

Кажется, что NULL указывает здесь, что ничего не выплачивается или ничего не нужно платить. То же самое, что и ноль. Таким образом, результат покажет все записи, которые превышают или недоплатили. –

+0

Если 'NULL' и ноль совпадают, таблица может быть изменена, чтобы запретить' NULL'. Главное, чтобы позволить «NULL» в первую очередь - иметь способ сказать «мы не знаем». Предполагая, что автор вопроса принял правильное решение по этому вопросу, обработка NULL как нулей была бы неверной.Конечно, единственным человеком, решившим, правильно это или нет, будет дизайнер таблицы. – dasblinkenlight

Смежные вопросы