[sql] NULL의 <>! = 연산자와 같지 않음

누군가 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)



답변

<>표준 SQL-92입니다. !=동일합니다. 둘 다 값에 대해 평가합니다. 이는 값 NULL이 없다고 NULL말하는 자리 표시 자입니다.

그렇기 때문에 그러한 상황에서는 술어로 IS NULL/ 만 사용할 수 있습니다 IS NOT NULL.

이 동작은 SQL Server에만 국한되지 않습니다. 모든 표준 호환 SQL 언어는 동일한 방식으로 작동합니다.

참고 : 귀하의 경우에 비교하기 위해 값이 null이 아닌 , 사용 IS NOT NULL과 비교하면서, NOT NULL 값, 당신은 사용 <> 'YOUR_VALUE'. 내 값이 NULL인지 아닌지를 말할 수는 없지만 내 값이 NULL인지 NOT NULL인지 말할 수 있습니다. 내 값이 NULL 이외의 값인지 비교할 수 있습니다.


답변

NULL에는 값이 없으므로 스칼라 값 연산자를 사용하여 비교할 수 없습니다.

즉, NULL에는 값이 없으므로 값이 NULL과 같거나 같을 수 없습니다.

따라서 SQL에는 NULL을 처리하기위한 특수 IS NULL 및 IS NOT NULL 술어가 있습니다.


답변

이 동작은 기본 (ANSI) 동작입니다.

만약 너라면:

 SET ANSI_NULLS OFF

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

다른 결과를 얻을 수 있습니다.

SET ANSI_NULLS OFF 분명히 미래에 사라질 것입니다 …


답변

SQL에서 NULL결과로 평가하고 계산하는 모든 것이 UNKNOWN으로

이런 이유로 SELECT * FROM MyTable WHERE MyColumn != NULL또는 SELECT * FROM MyTable WHERE MyColumn <> NULL당신에게 0 결과를 제공합니다.

NULL값을 확인하기 위해 isNull 함수가 제공됩니다.

또한 IS세 번째 쿼리에서 사용한 연산자를 사용할 수 있습니다 .

도움이 되었기를 바랍니다.


답변

NULL에 대한 유일한 테스트는 IS NULL 또는 IS NOT NULL입니다. 정의에 따라 값이 무엇인지 모르기 때문에 평등 테스트는 의미가 없습니다.

읽을 위키 백과 기사는 다음과 같습니다.

https://en.wikipedia.org/wiki/Null_(SQL)


답변

우리는 사용

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

MyColumn이 NULL 인 모든 행 또는 MyColumn이 빈 문자열 인 모든 행을 반환합니다. 많은 “최종 사용자”에게 NULL 대 빈 문자열 문제는 필요와 혼란이없는 구별입니다.


답변

나는 null이 다른 값이나 다른 null과 비교할 수없는 기능적이고 완벽한 이유를 보지 못하므로 명확하게 비교하고 문맥 상 동일하거나 그렇지 않다고 말할 수 있습니다. 재밌 네요 논리적으로 결론을 내리고 일관성을 유지하기 위해 끊임없이 고민해야합니다. 그것은 기능적이지 않으며, 더 기능적으로 만들고 철학자와 과학자들에게 일관성이 있는지 아닌지를 결정하고 “유니버설 논리”를 유지하는지 결론을 내립니다. 🙂 누군가 색인이나 다른 이유로 인해 있다고 말할 수 있습니다. 값과 같은 null을 지원하도록 할 수 없었습니다. 그것은 두 개의 빈 안경을 비교하는 것과 같습니다. 하나는 포도 나무 유리이고 다른 하나는 맥주 유리입니다. 우리는 객체 유형을 비교하지 않고 int와 varchar를 비교할 수있는 것과 같은 값을 포함합니다. 더 쉽고, 아무것도 아니고 두 가지 공통점이있는 것은 동일합니다. 동일하고 SQL을 작성하는 다른 사람들과 동일합니다. 우리는 일부 ANSI 표준으로 인해 이상한 방식으로 논리를 비교하여 논리를 끊임없이 깨뜨리기 때문에 SQL을 작성하는 다른 사람들과 동일합니다. 컴퓨터 전원을 사용하여 우리를 위해 그것을하지 않는 이유는 무엇입니까? 관련된 모든 것이 그것을 염두에두고 구성되면 속도가 느려질 것입니다. “아무것도 null이 아닙니다”, 사과가 아닙니다. apfel입니다. 기능적으로 여러분의 친구이며 여기에도 논리가 있습니다. 결국 중요한 것은 기능성이며, 그런 식으로 null을 사용하는 것은 기능성과 사용 편의성을 어느 정도 제공합니다. 더 유용합니까? ANSI 표준 때문에 이상한 방식으로 논리를 비교하여 논리를 끊임없이 깨뜨리고 있기 때문입니다. 컴퓨터 전원을 사용하여 우리를 위해 그것을하지 않는 이유는 무엇입니까? 관련된 모든 것이 그것을 염두에두고 구성되면 속도가 느려질 것입니다. “아무것도 null이 아닙니다”, 사과가 아닙니다. apfel입니다. 기능적으로 여러분의 친구이며 여기에도 논리가 있습니다. 결국 중요한 것은 기능성이며, 그런 식으로 null을 사용하는 것은 기능성과 사용 편의성을 어느 정도 제공합니다. 더 유용합니까? ANSI 표준 때문에 이상한 방식으로 논리를 비교하여 논리를 끊임없이 깨뜨리고 있기 때문입니다. 컴퓨터 전원을 사용하여 우리를 위해 그것을하지 않는 이유는 무엇입니까? 관련된 모든 것이 그것을 염두에두고 구성되면 속도가 느려질 것입니다. “아무것도 null이 아닙니다”, 사과가 아닙니다. apfel입니다. 기능적으로 여러분의 친구이며 여기에도 논리가 있습니다. 결국 중요한 것은 기능성이며, 그런 식으로 null을 사용하는 것은 기능성과 사용 편의성을 어느 정도 제공합니다. 더 유용합니까? 사과가 아닙니다. apfel입니다. 기능적으로 당신의 친구이며 여기에도 논리가 있습니다. 결국 중요한 것은 기능성이며, 그런 식으로 null을 사용하는 것은 기능성과 사용 편의성을 어느 정도 제공합니다. 더 유용합니까? 사과가 아닙니다. apfel입니다. 기능적으로 당신의 친구이며 여기에도 논리가 있습니다. 결국 중요한 것은 기능성이며, 그런 식으로 null을 사용하는 것은 기능성과 사용 편의성을 어느 정도 제공합니다. 더 유용합니까?

이 코드를 고려하십시오.

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

이 코드가 무엇을 반환하는지 아는 사람은 몇 명입니까? NOT 유무에 관계없이 0을 반환합니다. 나에게는 작동하지 않으며 혼란 스럽습니다. c #에서는 비교 연산이 값을 반환해야합니다. 논리적으로 이것도 값을 생성합니다. 왜냐하면 비교할 것이 없다면 (아무것도 제외 :). 그들은 단지 “보냈다”: null “returns”0과 비교할 때 많은 해결 방법과 두통이 발생합니다.

이것은 나를 여기로 가져온 코드입니다.

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

두 필드 (어디에서)에 다른 값이 있는지 비교해야합니다. 함수를 사용할 수는 있지만 …