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)
<>
- стандартный SQL-92; !=
является его эквивалентом. Оба оценивают значения, которые NULL
не являются - NULL
являются заполнитель, чтобы сказать, что существует отсутствие значения.
Именно поэтому вы можете использовать IS NULL
/ IS NOT NULL
как предикаты для таких ситуаций.
Это поведение не относится к SQL Server. Все диалоги SQL, соответствующие стандарту, работают одинаково.
Примечание. Для сравнения, если ваше значение не является нулевым, вы используете IS NOT NULL
, а для сравнения с ненулевым значением вы используете <> 'YOUR_VALUE'
. Я не могу сказать, равна ли моя ценность равным NULL, но я могу сказать, имеет ли значение NULL или NOT NULL. Я могу сравнить, если моя ценность - это нечто иное, чем NULL.
NULL не имеет значения и поэтому не может сравниваться с использованием операторов скалярного значения.
Другими словами, ни одно значение не может быть равно (или не равно) NULL, потому что NULL не имеет значения.
Следовательно, SQL имеет специальные IS NULL и IS NOT NULL предикаты для работы с NULL.
'a' != null
НЕ возвращает значение (true
/ 1
) встречно интуитивно и время от времени ловит меня! Я бы подумал, что «некоторая ценность по сравнению с отсутствием значения». всегда будет «не равным», но, возможно, это только я?!?
– DarthPablo
23 June 2014 в 15:56
Единственным тестом для NULL является NULL или NOT NULL. Тестирование на равенство бессмысленно, потому что по определению никто не знает, что такое значение.
Вот статья в википедии:
Обратите внимание, что это поведение по умолчанию (ANSI).
Если вы:
SET ANSI_NULLS OFF
http://msdn.microsoft.com/en- us / library / ms188048.aspx
Вы получите разные результаты.
SET ANSI_NULLS OFF
, по-видимому, уйдет в будущем ...
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
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. I> IMHO, последнее утверждение кажется немного странным в исключении нулей из результатов!
– DarthPablo
23 June 2014 в 16:06
Я просто не вижу, чтобы функциональная и цельная причина того, что нули не были сопоставимы с другими значениями или другими значениями нуля, потому что мы можем четко сравнить их и сказать, что они одинаковы или нет в нашем контексте. Это забавно. Просто из-за некоторых логических выводов и последовательности мы должны постоянно беспокоиться об этом. Он не работает, делает его более функциональным и оставляет его философам и ученым, если они согласуются или нет, и придерживаются ли они «универсальной логики». :) Кто-то может сказать, что это из-за индексов или чего-то еще, я сомневаюсь, что эти вещи не могут быть использованы для поддержки нулей, таких же, как значения. Это то же самое, что сравнивать два пустых стакана, один - виноградное стекло, а другое - это пивное стекло, мы не сравниваем типы объектов, но значения, которые они содержат, так же, как вы могли бы сравнить 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)
Я просто нужно сравнить, если два поля (где) имеют разные значения, я мог бы использовать функцию, но ...
Мы используем
SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';
для возврата всех строк, где MyColumn равен NULL, или всех строк, где MyColumn - пустая строка. Для многих «конечных пользователей» проблема с NULL и пустой строкой является различием без необходимости и путаницы.
В SQL все, что вы оцениваете / вычисляете с помощью NULL
, приводит к UNKNOWN
. Поэтому SELECT * FROM MyTable WHERE MyColumn != NULL
или SELECT * FROM MyTable WHERE MyColumn <> NULL
дает вам 0 результатов.
Чтобы обеспечить проверку значений NULL
, предоставляется функция isNull.
Кроме того, вы можете использовать оператор IS
, как вы использовали в третьем запросе.
Надеюсь, это поможет.
Старый вопрос, но следующее может предложить более подробную информацию.
null
не представляет значения или неизвестного значения. Он не указывает , почему нет значения, что может привести к некоторой двусмысленности.
Предположим, что вы запускаете такой запрос:
SELECT *
FROM orders
WHERE delivered=ordered;
т. е. вы ищете строки, где даты ordered
и delivered
совпадают.
Что следует ожидать, если один или оба столбца равны нулю?
хотя бы одна из дат неизвестна, вы не можете ожидать, что две даты совпадают. Это также случай, когда обе даты неизвестны: как они могут быть одинаковыми, если мы даже не знаем, что они представляют?
По этой причине любое выражение, обрабатывающее null
, поскольку значение должно терпеть неудачу. В этом случае он не будет соответствовать. Это также происходит, если вы попробуете следующее:
SELECT *
FROM orders
WHERE delivered<>ordered;
Опять же, как мы можем сказать, что два значения not одинаковы, если мы не знаем, что они .
SQL имеет специальный тест для отсутствующих значений:
IS NULL
В частности, это не сравнение значений , а скорее ищет .
Наконец, что касается оператора !=
, насколько мне известно, на самом деле он ни в одном из стандартов не поддерживается, но он очень широко поддерживается. Он был добавлен, чтобы заставить программистов с некоторых языков чувствовать себя как дома. Честно говоря, если программист с трудом запоминает, на каком языке они используют, они начинают плохо.
NULL
, мы подразумеваем, что мы сравниваем значение с «значением NULL
», а не значением «неопределенного значения, которое подстилающий NULL
является ¿иметь? но что мы не знаем », что, очевидно, мы не сможем узнать. Это действительно облегчит ситуацию.
– Pere
12 April 2018 в 08:57
IS NULL
гораздо труднее, чем писать = NULL
. Я думаю, что было бы более последовательным, если WHERE columnA = columnB
имеет ту же интерпретацию, что и WHERE columnA = NULL
, вместо того, чтобы рассматривать последний как частный случай. Помните, что NULL
имеет значение not i>. В языках программирования, где является i> законным для тестирования variable == null
, это происходит потому, что null
имеет другое значение; он не представляет собой нечто неизвестное, а преднамеренное сброс значения. Не так с SQL.
– Manngo
12 April 2018 в 09:06
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
NULL Нельзя сравнивать с каким-либо значением с помощью операторов сравнения. NULL = NULL является ложным. Нуль - это не значение. Оператор IS специально разработан для сравнения NULL.
null = null
, где можно было бы использовать 1=0
в некотором специальном запросе. И если они жалуются, я меняю его на null != null
:)
– SWeko
14 April 2011 в 08:30
Я хотел бы предложить этот код, который я сделал, чтобы определить, есть ли изменение значения, 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 делает его совместимым для различных типов
<>
находится в спецификации 92, но большинство поставщиков поддерживают!=
и / или включены в более позднюю версию, например, 99 или 03. – Thomas 14 April 2011 в 05:44!=
до ~ 9i, как я понимаю, что привело к синтаксису ANSI-92. Я убежден, что MySQL похож, начиная поддержку в 4.x. – OMG Ponies 14 April 2011 в 05:46!=
может быть включен в более позднюю спецификацию в качестве альтернативы<>
. Не играйте в новые спецификации, поэтому я не могу сказать точно. – Thomas 14 April 2011 в 17:14WHERE MyColumn != NULL
илиWHERE MyColumn = NULL
детерминированным? Или, другими словами, гарантировано ли всегда возвращать 0 строк, независимо от того, является лиMyColumn
нулевым в базе данных или нет? – Slauma 7 December 2011 в 17:20!=
оценивает только значения, выполнение чего-то вродеWHERE MyColumn != 'somevalue'
не вернет записи NULL. – jsumrall 12 February 2015 в 16:38