[SQL] NULL에 있지 <동일>! = 연산자
SQLNULL에 있지 <동일>! = 연산자
누군가가 SQL에서 다음 행동을 설명시겠습니까?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
해결법
-
==============================
1.<> 표준 SQL-92이고; ! = 그것과 동일합니다. NULL은 값의 부재가 말을 자리 표시 자입니다 - 둘 다하지 않은 NULL, 값을 평가합니다.
<> 표준 SQL-92이고; ! = 그것과 동일합니다. NULL은 값의 부재가 말을 자리 표시 자입니다 - 둘 다하지 않은 NULL, 값을 평가합니다.
당신이 사용 / NULL 경우에만 이러한 상황에 대한 조건으로 NULL을지지 않습니다 수있는 이유입니다.
이 문제는 SQL Server에 특정하지 않습니다. 모든 표준을 준수하는 SQL 언어는 같은 방식으로 작동합니다.
참고 : 당신의 값이 null이 아닌 경우 null 값과 비교하면서, null가 아닌 사용, 비교하려면, <> 'YOUR_VALUE'사용합니다. 내 값이 NULL로 동일하지 같거나 경우 내가 말할 수 없지만 내 값이 NULL 또는 NOT NULL의 경우 내가 말할 수 있습니다. 내 값이 NULL 이외의 경우 나는 비교할 수 있습니다.
-
==============================
2.NULL은 값이없는, 그래서 스칼라 값 연산자를 사용하여 비교 할 수 없습니다.
NULL은 값이없는, 그래서 스칼라 값 연산자를 사용하여 비교 할 수 없습니다.
즉, 값은 지금까지 동일 할 수 없습니다 (또는하지 같음) NULL 값이없는 때문에 NULL을.
따라서, SQL 특수가 NULL과 NULL을 다루는 NULL 술어을지지 않습니다 있습니다.
-
==============================
3.이 동작은 기본 (ANSI) 동작입니다 있습니다.
이 동작은 기본 (ANSI) 동작입니다 있습니다.
만약 너라면:
SET ANSI_NULLS OFF
http://msdn.microsoft.com/en-us/library/ms188048.aspx
당신은 다른 결과를 얻을 수 있습니다.
SET ANSI_NULLS OFF 분명히 미래에 멀리 갈 것입니다 ...
-
==============================
4.SQL에서, 아무것도 당신은 UNKNOWN에 NULL 결과에 / 컴퓨팅을 평가
SQL에서, 아무것도 당신은 UNKNOWN에 NULL 결과에 / 컴퓨팅을 평가
이런 이유로 SELECT * FROM을 MyTable WHERE MyColumn! = MyColumn <> NULL는 0 결과를 제공을 MyTable FROM NULL 또는 SELECT *.
NULL 값에 대한 검사를 제공하기 위해, isNull에 기능이 제공됩니다.
세 번째 질의에 사용되는 또에는 IS 연산자를 사용할 수있다.
도움이 되었기를 바랍니다.
-
==============================
5.NULL 인에 대한 유일한 테스트가 null 또는 NULL을지지 않습니다. 정의에 의해 값이 무엇인지 모르기 때문에 어떤지를 테스트하는 것은 무의미하다.
NULL 인에 대한 유일한 테스트가 null 또는 NULL을지지 않습니다. 정의에 의해 값이 무엇인지 모르기 때문에 어떤지를 테스트하는 것은 무의미하다.
여기에 읽을 수있는 위키 피 디아 문서입니다 :
https://en.wikipedia.org/wiki/Null_(SQL)
-
==============================
6.우리는 사용
우리는 사용
SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';
MyColumn는 NULL 또는 MyColumn은 빈 문자열 모든 행입니다 모든 행을 반환합니다. 많은에 "최종 사용자"로 빈 문자열 문제에 대 NULL이 필요과 혼란의 지점이없는 구분이다.
-
==============================
7.난 그냥 우리가 명확하게 비교하고 그들이 우리의 상황에서 동일하거나하지 않습니다 말할 수있는 원인 널의 기능과 원활한 이유는, 다른 값이나 널 (null)과 비교 될 수 없습니다 표시되지 않습니다. 그것은 재미있다. 그냥 있기 때문에 어떤 논리적 인 결론과 일관성의 우리는 끊임없이 귀찮게 할 필요가있다. 그것은 더 많은 기능하게하고 일관된 여부와는 "보편적 인 논리」를 개최 않는 경우 결론 철학자와 과학자에두고, 기능이 아니다. :) 다른 사람이, 내가 그 일을 같은 값으로 지원 널 (null)로 할 수 없다는 의심이 때문에 인덱스 나 뭔가 있다고 말할 수 있습니다. 그것은 두 개의 빈 안경을 비교하는 등 동일합니다, 하나는 포도 나무 유리이고 다른 하나는 그것이, 그것의 아무것도 무엇보다 쉽게 없어 널 (null)로, 우리는 당신이 INT와 VARCHAR을 비교할 수와 동일한 그들이 포함하는 객체하지만 값의 유형을 비교하지 않는 맥주 유리입니다 이 무 (無)는 우리가 지속적으로 있기 때문에 일부 ANSI 표준의 이상한 방법을 비교하여 그 논리를 파괴하기 때문에 그들이 나에 의하여 다른 사람이 쓰기 SQL에 의해 명확하게 비교, 동일, 공통점. 우리를 위해 그것을 할 컴퓨터의 전원을 사용하고 나는 그것이 관련된 모든 것을 염두에두고 구성되어있는 경우 아래로 물건을 느리게 것입니다 의심하지 왜. 어서, 그것의 apfel 사과 아니다 "그것의 아무것도를 null로하지 아니에요"... 기능적으로는 당신의 친구이고 논리도 여기에있다. 결국 문제는 기능이며, 그 방법이 더 많거나 적은 기능과 사용 편의성을 제공에 널 (null)을 사용하여 않는 유일한합니다. 그것은 더 유용합니까?
난 그냥 우리가 명확하게 비교하고 그들이 우리의 상황에서 동일하거나하지 않습니다 말할 수있는 원인 널의 기능과 원활한 이유는, 다른 값이나 널 (null)과 비교 될 수 없습니다 표시되지 않습니다. 그것은 재미있다. 그냥 있기 때문에 어떤 논리적 인 결론과 일관성의 우리는 끊임없이 귀찮게 할 필요가있다. 그것은 더 많은 기능하게하고 일관된 여부와는 "보편적 인 논리」를 개최 않는 경우 결론 철학자와 과학자에두고, 기능이 아니다. :) 다른 사람이, 내가 그 일을 같은 값으로 지원 널 (null)로 할 수 없다는 의심이 때문에 인덱스 나 뭔가 있다고 말할 수 있습니다. 그것은 두 개의 빈 안경을 비교하는 등 동일합니다, 하나는 포도 나무 유리이고 다른 하나는 그것이, 그것의 아무것도 무엇보다 쉽게 없어 널 (null)로, 우리는 당신이 INT와 VARCHAR을 비교할 수와 동일한 그들이 포함하는 객체하지만 값의 유형을 비교하지 않는 맥주 유리입니다 이 무 (無)는 우리가 지속적으로 있기 때문에 일부 ANSI 표준의 이상한 방법을 비교하여 그 논리를 파괴하기 때문에 그들이 나에 의하여 다른 사람이 쓰기 SQL에 의해 명확하게 비교, 동일, 공통점. 우리를 위해 그것을 할 컴퓨터의 전원을 사용하고 나는 그것이 관련된 모든 것을 염두에두고 구성되어있는 경우 아래로 물건을 느리게 것입니다 의심하지 왜. 어서, 그것의 apfel 사과 아니다 "그것의 아무것도를 null로하지 아니에요"... 기능적으로는 당신의 친구이고 논리도 여기에있다. 결국 문제는 기능이며, 그 방법이 더 많거나 적은 기능과 사용 편의성을 제공에 널 (null)을 사용하여 않는 유일한합니다. 그것은 더 유용합니까?
이 코드를 살펴 보자 :
SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end
얼마나 많은 당신은 무엇을이 코드를 반환합니다 아는 사람? 그것은 나에게 0을 반환하거나하지 않고 작동하지 않습니다 그것은 혼란이. C #에서 그것이해야 모든, 비교 작업은하지 않았다 경우 비교하는 것이 없기 때문에 논리적으로도 값을 생성, 값을 반환 없습니다 (를 제외하고는. 아무것도 :)). 그들은 단지 "며"아무것도 0 널 (null) "반환"에 비해 그 많은 해결과 두통을 만듭니다.
이 날 여기 데려온 코드입니다 :
where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)
난 그냥이 기능을 사용할 수, (에서) 두 개의 필드가 다른 값을 가질 경우 비교해야하지만 ...
-
==============================
8.NULL은 비교 연산자를 사용하여 값 비교 될 수 없습니다. NULL = NULL은 false입니다. 널은 값이 아닙니다. 운영자는 IS 특별히 핸들 NULL 비교하도록 설계된다.
NULL은 비교 연산자를 사용하여 값 비교 될 수 없습니다. NULL = NULL은 false입니다. 널은 값이 아닙니다. 운영자는 IS 특별히 핸들 NULL 비교하도록 설계된다.
-
==============================
9.내가 값의 변화가 있는지 찾기 위해 만든이 코드를 제안하고 싶습니다 난 새로운 가치와 (순서는 상관 없지만) 이전 인 거라고. 그 문제를 들어, 널 값에서 또는 그 변화에 반대로 변화하지만 널로부터 NULL로 아니된다 (물론, 다른 값의 값에서 변화되지만 값과 동일하게는되지 않음).
내가 값의 변화가 있는지 찾기 위해 만든이 코드를 제안하고 싶습니다 난 새로운 가치와 (순서는 상관 없지만) 이전 인 거라고. 그 문제를 들어, 널 값에서 또는 그 변화에 반대로 변화하지만 널로부터 NULL로 아니된다 (물론, 다른 값의 값에서 변화되지만 값과 동일하게는되지 않음).
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의 사용은 종류의 다양한 호환합니다
-
==============================
10.오래된 질문하지만, 다음은 좀 더 세부 사항을 제공 할 수 있습니다.
오래된 질문하지만, 다음은 좀 더 세부 사항을 제공 할 수 있습니다.
null가 값 또는 알 수없는 값을 나타냅니다 없습니다. 일부 모호함으로 이어질 수있는 값이없는 이유는 지정하지 않습니다.
이 같은 쿼리를 실행한다고 가정
SELECT * FROM orders WHERE delivered=ordered;
즉, 당신은 주문하고 배달 날짜가 동일한 행을 찾고 있습니다.
하나 또는 두 개의 열이 null 때 어떻게 예상 할 수있다?
날짜 중 적어도 하나를 알 수 있기 때문에, 당신은이 날짜가 같은 말을 기대할 수 없다. 우리는 심지어 그들이 무엇인지 모른다면 그들이 어떻게 동일 할 수있다 :이 두 날짜를 알 수없는 경우도있다?
이러한 이유로, 값으로 표현식 치료 널 (null)이 실패해야합니다. 이 경우, 일치하지 않습니다. 다음을 시도 할 경우에도의 경우 :
SELECT * FROM orders WHERE delivered<>ordered;
다시 말하지만, 우리는 어떻게 우리가 그들이 무엇인지 모르는 경우 두 값이 동일하지 않은 것을 말할 수있다.
SQL은 누락 된 값에 대한 특정 테스트가 있습니다 :
IS NULL
구체적으로는 값을 비교하는 것이 아니라, 오히려 누락 된 값을 찾고 있습니다.
마지막으로, 관련으로는! = 연산자는, 지금까지의 내가 알고, 그것은 표준의 실제로 아니지만, 그것은 매우 광범위하게 지원됩니다. 그것은 일부 언어에서 프로그래머가 집에서 더 느낄 수 있도록 하였다. 프로그래머들이 사용중인 언어 기억하는 것이 어려우며이있는 경우 솔직히, 그들은 나쁜 출발입니다.
-
==============================
11.NULL은 알 수없는 ... 아무것도 없습니다. NULL은 같지 아무것도 않습니다. 당신이 마법의 문구를 사용해야하는 이유는 SQL 쿼리 대신 = NULL의 NULL을 IS
NULL은 알 수없는 ... 아무것도 없습니다. NULL은 같지 아무것도 않습니다. 당신이 마법의 문구를 사용해야하는 이유는 SQL 쿼리 대신 = NULL의 NULL을 IS
당신은이를 참조 할 수 있습니다 : http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
from https://stackoverflow.com/questions/5658457/not-equal-operator-on-null by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 개의 서로 다른 곳 조항과 두 데이터 집합을 반환해야 (0) | 2020.03.10 |
---|---|
[SQL] 어떻게 MySQL의에서 CONCATENATE 문자열에 GROUP BY를 사용 하는가? (0) | 2020.03.10 |
[SQL] 어떻게 쿼리 PostgreSQL의 '그룹화'의 문자열 필드의 CONCATENATE 문자열에? (0) | 2020.03.10 |
[SQL] 최대 절전 모드는 실제 SQL을 보여 [중복] (0) | 2020.03.10 |
[SQL] SQL 서버 : 행에 열 (0) | 2020.03.10 |