Не содержит & lt; & gt; работа над нулевым значением [дубликат]

new_list = my_list[:]

new_list = my_list Попытайтесь это понять. Предположим, что my_list находится в памяти кучи в месте X, то есть my_list указывает на X. Теперь, назначив new_list = my_list, вы даете new_list указывать на X. Это называется мелкой копией.

Теперь, если вы назначили new_list = my_list[:], вы просто копируете каждый объект my_list в new_list. Это известно как Deep copy.

Другой способ, которым вы можете это сделать:

  • new_list = list(old_list)
  • import copy new_list = copy.deepcopy(old_list)
218
задан Ben 9 October 2014 в 13:24
поделиться

11 ответов

<> - стандартный SQL-92; != является его эквивалентом. Оба оценивают значения, которые NULL не являются - NULL являются заполнитель, чтобы сказать, что существует отсутствие значения.

Именно поэтому вы можете использовать IS NULL / IS NOT NULL как предикаты для таких ситуаций.

Это поведение не относится к SQL Server. Все диалоги SQL, соответствующие стандарту, работают одинаково.

Примечание. Для сравнения, если ваше значение не является нулевым, вы используете IS NOT NULL, а для сравнения с ненулевым значением вы используете <> 'YOUR_VALUE'. Я не могу сказать, равна ли моя ценность равным NULL, но я могу сказать, имеет ли значение NULL или NOT NULL. Я могу сравнить, если моя ценность - это нечто иное, чем NULL.

252
ответ дан Uddhav Gautam 22 August 2018 в 05:17
поделиться
  • 1
    На самом деле, я считаю, что <> находится в спецификации 92, но большинство поставщиков поддерживают != и / или включены в более позднюю версию, например, 99 или 03. – Thomas 14 April 2011 в 05:44
  • 2
    @Thomas: Oracle не поддерживал != до ~ 9i, как я понимаю, что привело к синтаксису ANSI-92. Я убежден, что MySQL похож, начиная поддержку в 4.x. – OMG Ponies 14 April 2011 в 05:46
  • 3
    Это, по-видимому, предполагает, что != может быть включен в более позднюю спецификацию в качестве альтернативы <>. Не играйте в новые спецификации, поэтому я не могу сказать точно. – Thomas 14 April 2011 в 17:14
  • 4
    Является ли результат WHERE MyColumn != NULL или WHERE MyColumn = NULL детерминированным? Или, другими словами, гарантировано ли всегда возвращать 0 строк, независимо от того, является ли MyColumn нулевым в базе данных или нет? – Slauma 7 December 2011 в 17:20
  • 5
    Следует также отметить, что, поскольку != оценивает только значения, выполнение чего-то вроде WHERE MyColumn != 'somevalue' не вернет записи NULL. – jsumrall 12 February 2015 в 16:38

NULL не имеет значения и поэтому не может сравниваться с использованием операторов скалярного значения.

Другими словами, ни одно значение не может быть равно (или не равно) NULL, потому что NULL не имеет значения.

Следовательно, SQL имеет специальные IS NULL и IS NOT NULL предикаты для работы с NULL.

75
ответ дан Barry Brown 22 August 2018 в 05:17
поделиться
  • 1
    +1. И, вопреки оператору OP, это не «Microsoft SQL». Тринальная логика определена в стандарте SQL, а MS в этой точке придерживается стандарта. – TomTom 14 April 2011 в 05:23
  • 2
    Я не предполагал, что это поведение Microsoft только. Я просто заявлял, что наблюдал это на Microsoft SQL Server. – Maxim Gershkovich 14 April 2011 в 05:27
  • 3
    Из интереса, есть ли ситуации, когда это (ожидаемое) поведение полезно? Мне кажется, что 'a' != null НЕ возвращает значение (true / 1) встречно интуитивно и время от времени ловит меня! Я бы подумал, что «некоторая ценность по сравнению с отсутствием значения». всегда будет «не равным», но, возможно, это только я?!? – DarthPablo 23 June 2014 в 15:56
  • 4
    Вероятно, это ошибка – JoelFan 5 May 2017 в 22:42
  • 5
    Я думаю, что интересно, что люди описывают NULL как « без значения ». Аналогично, говоря, что число 1 имеет значение, когда оно действительно является значением. Но NULL представляет собой не значение. – systemaddict 27 June 2017 в 20:19

Единственным тестом для NULL является NULL или NOT NULL. Тестирование на равенство бессмысленно, потому что по определению никто не знает, что такое значение.

Вот статья в википедии:

https: //en.wikipedia .org / вики / Null_ (SQL)

7
ответ дан beat 22 August 2018 в 05:17
поделиться

Обратите внимание, что это поведение по умолчанию (ANSI).

Если вы:

 SET ANSI_NULLS OFF

http://msdn.microsoft.com/en- us / library / ms188048.aspx

Вы получите разные результаты.

SET ANSI_NULLS OFF, по-видимому, уйдет в будущем ...

24
ответ дан Cade Roux 22 August 2018 в 05:17
поделиться
  • 1
    +1 ... не скоро. Теперь, когда я могу получить дубликат & quot; NULL в индексе? :( – user 14 April 2011 в 06:19
  • 2
    Вы можете получить дубликаты NULL в индексе SQL Server, добавив предложение WHERE в отфильтрованный индекс (например, create unique index UK_MyTable on MyTable (Column) where Column is not null): msdn.microsoft.com/en-us/library/cc280372.aspx – Anthony Mills 11 May 2014 в 00:14
  • 3
    Примечание из документов: Если SET ANSI_NULLS выключено, операторы сравнения Equals (=) и Not Equal To (& gt;) не соответствуют стандарту ISO. Оператор SELECT, который использует WHERE column_name = NULL, возвращает строки с нулевыми значениями в имени_ column_name. Оператор SELECT, который использует WHERE column_name <> NULL, возвращает строки, которые имеют ненулевые значения в столбце. Кроме того, оператор SELECT, который использует WHERE column_name <> XYZ_value, возвращает все строки, которые не являются XYZ_value и которые не являются NULL. IMHO, последнее утверждение кажется немного странным в исключении нулей из результатов! – DarthPablo 23 June 2014 в 16:06
  • 4
    Важно отметить из msdn doc : В будущей версии SQL Server [новее 2014] ANSI_NULLS всегда будет включен, и любые приложения, которые явно задают параметр к ВЫКЛ будет генерировать ошибку. Избегайте использования этой функции в новых разработках и планируйте изменять приложения, которые в настоящее время используют эту функцию. – Otiel 15 January 2015 в 09:43

Я просто не вижу, чтобы функциональная и цельная причина того, что нули не были сопоставимы с другими значениями или другими значениями нуля, потому что мы можем четко сравнить их и сказать, что они одинаковы или нет в нашем контексте. Это забавно. Просто из-за некоторых логических выводов и последовательности мы должны постоянно беспокоиться об этом. Он не работает, делает его более функциональным и оставляет его философам и ученым, если они согласуются или нет, и придерживаются ли они «универсальной логики». :) Кто-то может сказать, что это из-за индексов или чего-то еще, я сомневаюсь, что эти вещи не могут быть использованы для поддержки нулей, таких же, как значения. Это то же самое, что сравнивать два пустых стакана, один - виноградное стекло, а другое - это пивное стекло, мы не сравниваем типы объектов, но значения, которые они содержат, так же, как вы могли бы сравнить int и varchar, с нулевым, это еще проще, это ничего и что два ничего не имеют общего, они одинаковы, четко сопоставимы мной и всеми остальными, которые пишут sql, потому что мы постоянно нарушаем эту логику, сравнивая их странными способами из-за некоторых стандартов ANSI. Почему бы не использовать компьютерную мощь, чтобы сделать это для нас, и я сомневаюсь, что это замедлит работу, если все, что связано, будет построено с учетом этого. «Это не пусто, это ничего», это не яблоко, это апфель, давай ... Функционально ваш друг, и здесь есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом обеспечивает более или менее функциональность и простоту использования.

Рассмотрим этот код:

SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end

Сколько из вас знает, что будет возвращать этот код? С или без НЕ возвращает 0. Мне это не работает, и это запутывает. В c # это все так, как должно быть, операции сравнения возвращают значение, логически это тоже приводит к значению, потому что, если это не так, сравнивать нечего (кроме. Ничего :)). Они просто «сказали»: что-то по сравнению с нулевыми «возвращает» 0, и это создает много обходных решений и головных болей.

Это код, который привел меня сюда:

where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)

Я просто нужно сравнить, если два поля (где) имеют разные значения, я мог бы использовать функцию, но ...

3
ответ дан Hove 22 August 2018 в 05:17
поделиться

Мы используем

SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';

для возврата всех строк, где MyColumn равен NULL, или всех строк, где MyColumn - пустая строка. Для многих «конечных пользователей» проблема с NULL и пустой строкой является различием без необходимости и путаницы.

5
ответ дан Jeff Mergler 22 August 2018 в 05:17
поделиться

В SQL все, что вы оцениваете / вычисляете с помощью NULL, приводит к UNKNOWN

. Поэтому SELECT * FROM MyTable WHERE MyColumn != NULL или SELECT * FROM MyTable WHERE MyColumn <> NULL дает вам 0 результатов.

Чтобы обеспечить проверку значений NULL, предоставляется функция isNull.

Кроме того, вы можете использовать оператор IS, как вы использовали в третьем запросе.

Надеюсь, это поможет.

7
ответ дан Mahendra Liya 22 August 2018 в 05:17
поделиться

Старый вопрос, но следующее может предложить более подробную информацию.

null не представляет значения или неизвестного значения. Он не указывает , почему нет значения, что может привести к некоторой двусмысленности.

Предположим, что вы запускаете такой запрос:

SELECT *
FROM orders
WHERE delivered=ordered;

т. е. вы ищете строки, где даты ordered и delivered совпадают.

Что следует ожидать, если один или оба столбца равны нулю?

хотя бы одна из дат неизвестна, вы не можете ожидать, что две даты совпадают. Это также случай, когда обе даты неизвестны: как они могут быть одинаковыми, если мы даже не знаем, что они представляют?

По этой причине любое выражение, обрабатывающее null, поскольку значение должно терпеть неудачу. В этом случае он не будет соответствовать. Это также происходит, если вы попробуете следующее:

SELECT *
FROM orders
WHERE delivered<>ordered;

Опять же, как мы можем сказать, что два значения not одинаковы, если мы не знаем, что они .

SQL имеет специальный тест для отсутствующих значений:

IS NULL

В частности, это не сравнение значений , а скорее ищет .

Наконец, что касается оператора !=, насколько мне известно, на самом деле он ни в одном из стандартов не поддерживается, но он очень широко поддерживается. Он был добавлен, чтобы заставить программистов с некоторых языков чувствовать себя как дома. Честно говоря, если программист с трудом запоминает, на каком языке они используют, они начинают плохо.

1
ответ дан Manngo 22 August 2018 в 05:17
поделиться
  • 1
    Это то же самое "бессмысленное" & Quot; логика & Quot; что @Hove описывает в своем ответе. Правда в том, что в этом контексте нет необходимости в дополнительных принадлежностях; можно легко предположить, что когда мы сравниваем что-то с NULL, мы подразумеваем, что мы сравниваем значение с «значением NULL», а не значением «неопределенного значения, которое подстилающий NULL является ¿иметь? но что мы не знаем », что, очевидно, мы не сможем узнать. Это действительно облегчит ситуацию. – Pere 12 April 2018 в 08:57
  • 2
    @Pere Я бы не сказал, что это строго «бессмысленно», и я не уверен, что писать IS NULL гораздо труднее, чем писать = NULL. Я думаю, что было бы более последовательным, если WHERE columnA = columnB имеет ту же интерпретацию, что и WHERE columnA = NULL, вместо того, чтобы рассматривать последний как частный случай. Помните, что NULL имеет значение not . В языках программирования, где является законным для тестирования variable == null, это происходит потому, что null имеет другое значение; он не представляет собой нечто неизвестное, а преднамеренное сброс значения. Не так с SQL. – Manngo 12 April 2018 в 09:06
  • 3
    Вот почему я заключил это между кавычками, @Mangoo;) (а также «логикой»). Не сердись на меня; Я говорил об ANSI & quot; рассуждении & quot ;, а не о вашем объяснении. Я согласен с тем, что между IS NULL и =NULL в вашем последнем примере нет накладных расходов. Но взгляните на последнюю. Я устал испытывать это снова и снова, мне приходится делать ненужные нагрузки? дополнительная проверка ... – Pere 12 April 2018 в 14:34

NULL - это не что-то ... это неизвестно. NULL ничего не значит. Вот почему вы должны использовать магическую фразу IS NULL вместо = NULL в ваших SQL-запросах

Вы можете ссылаться на это: http://weblogs.sqlteam.com/markc/archive/2009 /06/08/60929.aspx

0
ответ дан Shadow 22 August 2018 в 05:17
поделиться

NULL Нельзя сравнивать с каким-либо значением с помощью операторов сравнения. NULL = NULL является ложным. Нуль - это не значение. Оператор IS специально разработан для сравнения NULL.

4
ответ дан Vincent Ramdhanie 22 August 2018 в 05:17
поделиться
  • 1
    Мне всегда нравились смутные люди, когда я иногда использовал null = null, где можно было бы использовать 1=0 в некотором специальном запросе. И если они жалуются, я меняю его на null != null :) – SWeko 14 April 2011 в 08:30
  • 2
    «NULL = NULL является ложным». Это не так. NULL = NULL вычисляет значение unknown , а не false. – sqlvogel 14 April 2011 в 09:22
  • 3
    @dportas, это так, но я имел в виду, что в условном случае это не будет считаться истинным. – Vincent Ramdhanie 14 April 2011 в 12:17
  • 4
    @VincentRamdhanie не является ложным; на самом деле, в postgres он будет оцениваться как NULL – Pere 12 April 2018 в 08:46

Я хотел бы предложить этот код, который я сделал, чтобы определить, есть ли изменение значения, i - новое значение, а d - старый (хотя порядок не имеет значения). В этом случае изменение от значения до нуля или наоборот - это изменение, но от нуля до нуля не является (конечно, от значения до другого значения является изменение, но от значения к тому же оно не является).

CREATE FUNCTION [dbo].[ufn_equal_with_nulls]
(
    @i sql_variant,
    @d sql_variant
)
RETURNS bit
AS
BEGIN
    DECLARE @in bit = 0, @dn bit = 0
    if @i is null set @in = 1
    if @d is null set @dn = 1

    if @in <> @dn
        return 0

    if @in = 1 and @dn = 1
        return 1

    if @in = 0 and @dn = 0 and @i = @d
        return 1

    return 0

END

Чтобы использовать эту функцию, вы можете

declare @tmp table (a int, b int)
insert into @tmp values
(1,1),
(1,2),
(1,null),
(null,1),
(null,null)

---- in select ----
select *, [dbo].[ufn_equal_with_nulls](a,b) as [=] from @tmp

---- where equal ----
select *,'equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 1

---- where not equal ----
select *,'not equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 0

. Результаты:

---- in select ----
a   b   =
1   1   1
1   2   0
1   NULL    0
NULL    1   0
NULL    NULL    1

---- where equal ----
1   1   equal
NULL    NULL    equal

---- where not equal ----
1   2   not equal
1   NULL    not equal
NULL    1   not equal

Использование sql_variant делает его совместимым для различных типов

-1
ответ дан Yariv de Botton 22 August 2018 в 05:17
поделиться
Другие вопросы по тегам:

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