что является “=null”, и “ЯВЛЯЕТСЯ ПУСТЫМ”

Если вы используете RXJS 6 или выше, вы должны передать операцию

 this.http.post('http://localhost:8080/users/register',user,{headers:headers})
 .pipe(map(response => {
   // do something with response and return it
 })
 catchError(this.errorHandler)
  );

также, если вы используете HttpClient вместо Http, тогда нет необходимости в response.json() как ответ будет десериализован JSON.

31
задан skrrgwasme 30 March 2016 в 15:52
поделиться

3 ответа

В предложении WHERE column=null никогда не будет истинным, недопустимо использовать ноль таким образом, нужно сказать column IS NULL или column IS NOT NULL. Это говорит об особой природе NULL, это не значение для проверки на равенство, это неизвестное значение, поэтому вам нужно использовать синтаксис IS или IS NOT.

Вы можете назначить что-то значение NULL, используя = равное. Например: UPDATE TableX SET Column=NULL...

ссылки:
Википедия NUll (SQL)
w3schools SQL NULL Values ​​
Учебник по SQL, см. Раздел «Оператор IS NULL»

38
ответ дан anonymous user 27 November 2019 в 22:05
поделиться

= NULL используется для присвоения значения NULL, тогда как IS NULL используется для определения, является ли переменная значением NULL.

Пример sssignment для NULL:

Update TableName Set ColumnName = NULL

Пример сравнения со значением NULL в условном предложении ( ссылка ):

Select * From TableName Where ColumnName is NULL

ColumnName IS NOT Null также можно использовать, чтобы убедиться, что значение не равно NULL.

7
ответ дан Trey Hunner 27 November 2019 в 22:05
поделиться

«= NULL» является выражением значения Теперь «IS NULL» является предпочтительным методом для оценки состояния переменной, имеющей значение NULL.

Более подробное обсуждение того же вопроса можно найти по следующей ссылке

http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/

Не уверен, можно ли прочитать статью без входа на сайт, поэтому разместите копию здесь

Понимание разницы между «IS NULL» и «= NULL»

Когда переменная создается в SQL с помощью оператора declare, она создается без данных и хранится в таблице переменных (vtable) внутри пространства памяти SQL. Таблица vtable содержит имя и адрес памяти переменной. Однако, когда переменная создается, ей не выделяется адрес памяти, и, таким образом, переменная не определяется в терминах памяти.

Когда вы УСТАНАВЛИВАЕТ переменную, ей назначается адрес памяти, и начальные данные сохраняются по этому адресу. Когда вы снова устанавливаете значение, данные в адресе памяти, на который указывает переменная, затем изменяются на новое значение.

Теперь о разнице и почему каждый ведет себя именно так.

«= NULL»

«= NULL» - это выражение значения. Это означает, что если переменная была установлена ​​и для хранения данных создана память, у нее есть значение. Фактически, для переменной может быть установлено значение NULL, что означает, что значение данных объектов неизвестно. Если значение было установлено следующим образом:

DECLARE @val CHAR(4)



SET @val = NULL

Вы явно установили значение данных как unknown, и когда вы это сделаете:

If @val = NULL

Оно будет оцениваться как истинное выражение.

Но если я это сделаю:

DECLARE @val CHAR(4)



If @val =  NULL

Будет оценено как ложное.

Причина в том, что я проверяю NULL как значение @val. Поскольку я не установил значение @val, адрес памяти не был назначен, и поэтому для @val нет значения.

Примечание: См. Раздел SET ANSI_NULLS (ON | OFF) из-за различий в значениях по умолчанию SQL 7 и 2000, из-за которых примеры не работают. Это основано на SQL 7.

«IS NULL»

Теперь «IS NULL» немного сложнее и является предпочтительным методом для оценки состояния переменной, имеющей значение NULL. Когда вы используете предложение «IS NULL», оно проверяет и адрес переменной, и данные внутри переменной как неизвестные. Так что, если я, например, сделаю:

DECLARE @val CHAR(4)



If @val IS NULL

            PRINT ‘TRUE’

ELSE

            PRINT ‘FALSE’



SET @val = NULL



If @val IS NULL

            PRINT ‘TRUE’

ELSE

            PRINT ‘FALSE’

Оба выхода будут ИСТИНА. Причина в первом @val IS NULL. Я только объявил переменную, и не было задано адресное пространство для данных, для которых проверяется «IS NULL». А во втором случае значение было явно установлено на NULL, что также проверяется «IS NULL».

SET ANSI_NULLS (ON | OFF)

А теперь позвольте мне немного поработать. В предыдущих примерах вы видите, что = NULL будет работать, пока значение задано явно. Однако, когда вы устанавливаете ANSI_NULLS ON, все будет вести себя немного иначе.

Пр.

DECLARE @val CHAR(4)



SET @val = NULL



SET ANSI_NULLS ON



If @val =NULL

            PRINT ‘TRUE’

ELSE

            PRINT ‘FALSE’



SET ANSI_NULLS OFF



If @val =NULL

            PRINT ‘TRUE’

ELSE

            PRINT ‘FALSE’

Вы заметите, что при первом запуске оператора = NULL после выполнения SET ANSI_NULLS ON вы получите FALSE, а после установки OFF вы получите TRUE. Причина в следующем.

Выдержка из статьи SQL BOL «SET ANSI_NULLS»

Стандарт SQL-92 требует, чтобы сравнение равно (=) или не равно (<>) с нулевым значением оценивалось как FALSE.Когда для SET ANSI_NULLS установлено значение ON, оператор SELECT с использованием WHERE column_name = NULL возвращает нулевые строки, даже если в столбце имя_столбца есть нулевые значения. Оператор SELECT, использующий WHERE column_name <> NULL, возвращает нулевые строки, даже если в столбце имя_столбца есть ненулевые значения.

Когда для SET ANSI_NULLS установлено значение OFF, операторы сравнения Equals (=) и Not Equal To (<>) не соответствуют стандарту SQL-92. Оператор SELECT с использованием WHERE column_name = NULL возвращает строки с нулевыми значениями в column_name. Оператор SELECT с использованием WHERE column_name <> NULL возвращает строки с ненулевыми значениями в столбце. Кроме того, инструкция SELECT с использованием WHERE column_name <> XYZ_value возвращает все строки, которые не являются значением XYZ и не равны NULL.

Конец выдержки

Таким образом, как определено в SQL92, «= NULL» всегда должно оцениваться как ложное. Таким образом, даже установка значения явно означает, что вы никогда не встретите условие = NULL if, и ваш код может работать не так, как задумано. Самая большая причина, по которой = NULL выстрелит вам в ногу, заключается в том, что SQL 7 при поставке и установке по умолчанию имеет значение ANSI_NULL OFF, а для SQL 2000 по умолчанию установлено значение ANSI_NULL ON. Конечно, вы можете изменить это несколькими способами, но если вы обновили базу данных с 7 до 2000 и обнаружили, что = NULL работает только тогда, когда вы явно устанавливаете if, когда вы развертываете сервер 2000 по умолчанию, ваш код теперь ломается и может вызвать проблемы с данными.

Еще одна причина использовать IS NULL вместо этого, так как в соответствии с рекомендациями SQL 92 он все равно будет оцениваться как TRUE, и, таким образом, ваш код более безопасен для обновления сервера.

Резюме

Если сводка, если вам не нужно проверять, что значение переменной было установлено равным NULL и вы установили ANSI_NULLS ON, то всегда используйте предложение «IS NULL» для проверки того, имеет ли переменная значение NULL.Используя вместо этого = NULL, вы можете причинить себе много головной боли, пытаясь устранить проблемы, которые могут возникнуть из-за этого, сейчас или неожиданно в будущем.

Основа

Часть предоставленной информации основана на том, как работает C ++ и как SQL ведет себя в каждой ситуации. К сожалению, SQL, насколько мне известно, не имеет функции addressof, позволяющей мне выводить фактический адрес памяти, чтобы показать, что происходит под капотом. В C ++, когда переменная создается, переменная имеет адрес 0xddddddd (при отладке, но также могут быть разные нереальные адреса). Когда вы устанавливаете переменную в первый раз, проверка адреса даст вам действительный адрес памяти, где хранятся данные. Кроме того, дополнительную информацию можно получить в электронной документации по SQL в разделах IS NULL и SET ANSI_NULLS….

18
ответ дан 27 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: