programing

SQL 서버에서 NULL = NULL이 false로 평가되는 이유

codeshow 2023. 4. 7. 21:49
반응형

SQL 서버에서 NULL = NULL이 false로 평가되는 이유

Server가 있는 SQL nullParam=NULL여기서이것은 직관에 어긋나 많은 오류를 일으켰습니다.확실히 는 하고 .IS NULL ★★★★★★★★★★★★★★★★★」IS NOT NULL이치노"SQL Server" "SQL Server" "SQL Server" "SQL Server" "SQL Server" "SQL Server" "SQL Server" "SQL Server?"

이 경우 null을 "알 수 없음"으로 간주합니다(또는 "존재하지 않음").두 경우 모두 동등하다고 말할 수 없습니다. 왜냐하면 둘 다 가치를 모르기 때문입니다.따라서 null=displaces는 true가 아닌 것으로 평가됩니다(시스템에 따라 false 또는 null). 두 값이 동일하다고 할 수 있는 값을 모르기 때문입니다.이 동작은 ANSI SQL-92 표준에 정의되어 있습니다.

편집: 이것은 ansi_nulls 설정에 따라 달라집니다.ANSI_NULLS가 꺼진 경우 이 값은 true로 평가됩니다.예를 들어 다음 코드를 실행합니다.

set ansi_nulls off

if null = null
    print 'true'
else
    print 'false'


set ansi_nulls ON

if null = null
    print 'true'
else
    print 'false'

프랭크는 몇 살이에요?잘 모르겠어요.

셜리는 몇 살이에요?잘 모르겠어요.

프랭크와 셜리는 동갑입니까?

정답은 "아니다"가 아니라 "모르겠습니다"(null)가 되어야 합니다. 프랭크와 셜리는 나이가 같을 수 있기 때문에, 우리는 전혀 모릅니다.

여기서 제 입장을 밝히겠습니다.

★★★NULL = NULLFALSE정답을 맞췄습니다.NULL이유는 이렇다.Dewayne Christensen은 Scott Ivey에게 쓴 코멘트에서 다음과 같이 말했습니다.

12월이니까 계절적인 예를 들어보자.나무 밑에 선물이 두 개 있어요.자, 내가 같은 걸 두 개나 가졌는지 말해 봐

둘 다 다를 수도 있고 같을 수도 있습니다. 둘 다 열어보기 전에는 알 수 없습니다.누가 알겠는가?당신은 서로 모르는 두 사람을 초대했고, 두 사람 모두 당신에게 같은 선물을 했습니다 - 드물지만 불가능하지는 않습니다.

알 수 없다(Unknown?은 UNKNOWN 수 없음NULL를 참조해 주세요.

이 예는 "..(false ★★★★★★★★★★★★★★★★★」null(시스템에 따라 다름).."는 정답입니다.그렇지 않습니다. NULL3VL로이 나오는 .VL로 올바른가(혹은 오답이 나오는 시스템을 받아도 괜찮습니까)?)

이 질문에 대한 정답은 다음 두 가지 사항을 강조해야 합니다.

  • 3가 논리(3VL)는 직관에 반한다(확인을 위해 Stackoverflow 및 기타 포럼에서 이 주제에 대한 수많은 질문을 참조).
  • SQL 기반 DBMS는 3VL조차 존중하지 않고 잘못된 답변을 하는 경우가 많습니다(원래 포스터에서 설명한 것처럼 이 경우 SQL Server가 존중합니다).

다시 한 번 강조합니다.SQL은 다음과 같은 반복적인 평등의 속성을 해석하도록 강요하는 것은 좋지 않습니다.

for any x, x = x §§ (in plain English: whatever the universe of discourse, a "thing" is always equal to itself).

(..3VL)TRUE,FALSE,NULL는 2VL에TRUE,FALSE합니다).x = x TRUEx - no - no - - - 。

또, NULL은 유효한 「비값」(변수로서 어트리뷰트치(--)로서 할당할 수 있는)임을 주의해 주세요.따라서 논리식 유형뿐만 아니라 모든 유형(도메인)에서 허용되는 값입니다.

요점은 이렇습니다.NULL가치로써는 "야수"입니다.완곡한 표현 없이, 나는 "말도 안 되는 소리"라고 말하고 싶다.

나는 이 공식이 훨씬 더 명확하고 논쟁의 여지가 적다고 생각한다 - 나의 부족한 영어실력에 대해 사과한다.

이것은 NULL의 문제 중 하나일 입니다.가능하면 그들을 완전히 피하는 것이 좋다.

§ 여기서의 가치관에는 관심이 있기 때문에, 2개의 제시가 항상 다른 물리적인 오브젝트라는 것은 유효한 반론이 아닙니다.당신이 납득할 수 없다면,여기서는 값과 "객체" 시멘틱스의 차이를 설명할 수 없습니다(Relational Algebra는 처음부터 값 시멘틱스를 가지고 있습니다.Codd의 정보 원칙을 참조하십시오.일부 SQL DBMS 구현자는 공통 시멘틱스조차 신경 쓰지 않는 것 같습니다).

내가 아는 한, 이것은 고대부터 받아들여진 (형식이나 다른 형태에서는 항상 2VL로 해석된다) 공리이며, 정확히는 매우 직관적이기 때문이다. 3VL(실제 로직스 패밀리)은 훨씬 최근의 발전이다(그러나 언제 처음 개발되었는지는 확실하지 않다).

참고: 누군가가 SQL NULL을 정당화하기 위한 시도로 Bottom, Unit, Option Type을 소개한다면, NULL을 사용한SQL 구현이 어떻게 사운드 타입 시스템을 갖추고 있는지 자세히 검토한 후에야 납득하고 마지막으로 NULL(values-not-quite-values)이 무엇인지 명확히 알 수 있을 입니다.


다음에 나는 몇 명의 저자를 인용할 것이다.모든 오류나 누락은 아마도 나의 것일 것이고 원작자의 것이 아니다.

SQL NULL의 Joe Celko

나는 이 포럼에서 Joe Celko가 자주 인용되는 것을 본다.듣자하니 그는 이곳에서 매우 존경받는 작가인 것 같다.그래서 저는 생각했습니다. "그는 SQL NULL에 대해 무엇을 썼습니까?그는 NULL의 수많은 문제를 어떻게 설명합니까?"제 친구 중 한 명은 고급 SQL 프로그래밍, 제3판인 스마트용 Joe Celko SQL의 전자책 버전을 가지고 있습니다.어디 보자.

먼저 목차입니다.가장 인상적인 것은 NULL이 언급된 횟수와 가장 다양한 컨텍스트입니다.

및 3.4 null NULL 109
5 110 3.5 NULL 의 값
110 3.5.1 NULLIF() 110110
NULL: in 185 6 의에 : SQL 185 에 6 6 6 6 6 6
NULL 6.4 NULL 교 190 비교
및 190 6.5 NULL © Logic 190
6.5.1 을 나타냅니다.
193 6.5.2 SQL 193
및 193 6.6 은 193 은 193 입니다.
7 와 NULL 6.7은 193
및 194 6.8
6.9 NULLs 195에 설계
197의 을 회피하는 6.9.1의 NULL
6 6.10의 NULL의 198
NULL 10.1 IS
1.1.1 NULLs 242의 소스

기타 등등.'악랄한 특수 케이스'로 들리네요

저작권상의 이유로, 본서의 발췌를 가지고, 몇개의 케이스에 대해 설명하겠습니다.나는 이 인용들이 "공정한 사용" 원칙에 속하고 심지어 책을 사도록 자극할 수 있다고 생각한다. 그래서 나는 아무도 불평하지 않기를 바란다.또, 같은 이유로 코드 스니펫의 보고는 삼가겠습니다.미안해요.데이터 추론에 대해 읽으려면 책을 구입하십시오.

다음 괄호 안에 있는 페이지 번호.

NOT NULL 제약 (11)

가장 중요한 열 제약 조건은 NOT NULL로, 열에서 NULL을 사용할 수 없습니다.이 구속조건을 일상적으로 사용하고 타당한 이유가 있는 경우에만 삭제하십시오.데이터에 대해 쿼리를 작성할 때 NULL 값의 복잡성을 방지하는 데 도움이 됩니다.

값이 아니라 값이 들어갈 수 있는 위치를 유지하는 마커입니다.

다시 말씀드리지만, 이 "가치 있는 것은 아니지만" 말도 안 되는 것은 아닙니다.나머지는 나에게 꽤 합리적인 것 같다.

(12)

즉, NULL은 SQL에서 많은 불규칙한 기능을 발생시킵니다.이것에 대해서는 나중에 설명하겠습니다.피할 수 없는 경우 NULL의 상황과 규칙을 암기하는 것이 최선의 방법입니다.

SQL, NULL 및 무한 확장:

(104) 제3장: SQL의 수치 데이터

SQL은 몇 가지 이유로 IEEE 수학 모델을 승인하지 않았습니다.

...

SQL에서 IEEE 연산 규칙을 사용할 수 있는 경우 무한의 유형 변환 규칙과 변환 후 무한의 정확한 수치를 나타내는 방법이 필요합니다.사람들은 NULL에 대해 충분히 문제가 있으니 거기 가지 맙시다.

SQL 구현은 특정 컨텍스트에서 NULL이 실제로 무엇을 의미하는지 결정하지 못했습니다.

3.6.2 지수 함수(116)

문제는 (x <= 0)일 때 로그가 정의되지 않는다는 것입니다.SQL 구현 에는 오류 메시지가 반환되는 것도 있고 NULL 및 DB2/400이 반환되는 것도 있습니다.버전 3 릴리스 1에서는 결과적으로 *NEGINF("negative infinity")가 반환됩니다.

Joe Celko가 David McGoveran과 C. J.의 말을 인용한 날짜:

6개의 특수한 절차: SQL에 데이터가 없음(185개)

David McGoveran과 C. J. Date는 저서 "A Guide to Sybase and SQL Server"에서 다음과 같이 말했습니다. "최소한 현재 SQL에서 정의 및 구현되어 있는 것처럼 NULL보다 훨씬 더 많은 문제가 있으며 피해야 합니다. NULL은 매우 이상하고 일관되지 않은 행동을 보이며 오류와 혼란의 원인이 될 수 있습니다.(이러한 코멘트 및 비판은 SQL Server뿐만 아니라 SQL 스타일의 NULL을 지원하는 모든 시스템에 적용됩니다).

약물 중독으로서의 특수한 절차:

(186/187)

이 책의 나머지 부분에서는 그것들을 사용하지 말라고 충고할 것입니다. 모순적으로 보일 수도 있지만, 그렇지 않습니다.NULL을 약으로 생각해 주세요.적절하게 사용하면 효과가 있지만 남용하면 모든 것을 망칠 수 있습니다.가능한 경우 NULL을 피하고 필요할 때 NULL을 적절하게 사용하는 것이 최선의 정책입니다.

여기서 저의 독특한 반대는 특정 구현 동작과 상호 작용하지 않는 "적절하게 사용"하는 것입니다.

서브쿼리 술어의 6.5.1 NULLS(191/192)

서브쿼리는 종종 NULL과의 비교를 숨깁니다.다음 2개의 표를 참조해 주십시오.

...

결과는 비어 있습니다.이것은 직관에 어긋나지만 옳다.

(표준)

6.5.2 표준 SQL 솔루션(193)

SQL-92는 다음과 같은 형식의 새로운 술어를 추가하여 3VL(3값 로직) 문제의 일부를 해결했습니다.

<검색 조건> IS [NOT] TRUE | FALSE | UNKNOWN

그러나 UNKNOWN은 그 자체로 문제의 근원이기 때문에 C. J. Date는 아래에 인용된 그의에서 4.5장에 언급된다. SQL에서의 Null 회피:

  • 어떤 상황에서도 UNKNOWN 키워드를 사용하지 마십시오.

아래에 링크된 UNKNOWN의 "ASIDE"를 참조하십시오.

6.8 특수한 절차 및 호스트 언어(194)

그러나 NULL을 호스트 프로그램에 전달해야 할 경우 NULL이 어떻게 처리되는지 알아야 합니다.임베딩이 정의되어 있는 표준 호스트 언어는 NULL을 지원하지 않습니다.이는 데이터베이스 스키마에서 NULL을 사용하지 않는 또 다른 좋은 이유입니다.

(표준)

6.9 NULL 설계에 관한 조언(195)

가능한 한 모든 열에 NOT NULL 제약 조건을 사용하여 모든 기본 테이블을 선언하는 것이 좋습니다.NULL은 SQL을 모르는 사람들을 혼란스럽게 하고 NULL은 비용이 많이 듭니다.

이의: NULL은 SQL을 잘 아는 사람도 헷갈리게 합니다(아래 참조).

(195)

외부 키에서는 NULL을 피해야 합니다.SQL은 이러한 "의혹의 이점" 관계를 허용하지만 조인을 포함하는 쿼리에서 정보가 손실될 수 있습니다.예를 들어, Orders 테이블에서 FORNE KEY로 참조되는 인벤토리의 부품 번호 코드를 지정하면 NULL이 있는 부품의 목록을 가져오는 데 문제가 발생합니다.이는 필수 관계이므로 존재하지 않는 부품을 주문할 수 없습니다.

(표준)

6.9.1 호스트 프로그램으로부터의 NULL 회피(197)

일부 프로그래밍 규칙을 사용하여 호스트 프로그램에서 데이터베이스에 NULL을 삽입하지 않아도 됩니다.

...

  1. 누락된 데이터가 프로그래밍 및 리포트에 미치는 영향을 확인합니다.집계 함수를 사용하는 쿼리는 잘못된 결과를 제공할 수 있기 때문에 NULL이 있는 숫자 열은 문제가 됩니다.

(표준)

(227)

빈 집합의 SUM()은 항상 NULL입니다. 이 트릭을 사용할 때 발생하는 가장 일반적인 프로그래밍 오류 중 하나는 두 개 이상의 행을 반환할 수 있는 쿼리를 쓰는 것입니다.생각하지 않았다면 마지막 예를 다음과 같이 썼을 것입니다.

(표준)

10.1.1 NULL의 소스(242)

NULL이 발생할 수 있는 위치를 기억하는 것이 중요합니다.이러한 값은 열에서 가능한 값 이상입니다.빈 세트의 집약 함수, OUTER JOIN, NULL을 사용하는 산술식 및 OLAP 연산자는 모두 NULL을 반환합니다.이러한 구조는 VIEWS에 열로 표시되는 경우가 많습니다.

(표준)

(301)

IN 술어를 EXIST 술어로 변환하려고 하면 NULL의 또 다른 문제가 발견됩니다.

(표준)

16.3 모든 술어와 익스트림 함수(313)

SQL에서 이러한 두 가지 술어가 동일하지 않다는 것은 처음에는 직관에 어긋납니다.

...

단, extrema 함수의 규칙은 기억해야 합니다.이러한 함수는 큰 값 또는 작은 값을 반환하기 전에 모든 NULL을 폐기합니다.ALL 술어는 NULL을 폐기하지 않으므로 결과에 NULL을 가져올 수 있습니다.

(표준)

(315)

다만, 표준의 정의는 부정적으로 표현되어 있기 때문에, NULL은 의문의 여지가 있습니다.

보시는 바와 같이 UNIQURE 제약조건에서는 NULL을 피하는 것이 좋습니다.

그룹화 기준:

NULL은 모두 동일한 것으로 취급되어 독자적인 그룹을 형성합니다.그런 다음 각 그룹은 오래된 결과 테이블을 대체하는 새 결과 테이블의 단일 행으로 축소됩니다.

즉, GROUP BY 절의 NULL = NULL은 3VL과 같이 NULL로 평가되지 않지만 TRUE로 평가됩니다.

SQL 표준은 혼란스럽다.

ORDER BY 및 NULL (329)

NULL인 정렬 키 값이 NULL이 아닌 값보다 크거나 작은 것으로 간주되는지 여부는 구현 정의되지만...

...어느쪽이든 SQL 제품이 이를 실현합니다.

1999년 3월 Chris Farrar는 개발자 중 한 명으로부터 질문을 받고 SQL Standard의 일부를 검토하게 되었습니다.이것에 의해, 제가 이해했다고 생각되는 부분이 확인되었습니다.Chris는 일반적인 이해와 사양서의 실제 표현 사이에 몇 가지 차이점을 발견했습니다.

기타 등등.나는 셀코로 충분하다고 생각한다.

C. J. SQL NULL 날짜

C. J. Date는 NULL에 대해 더 급진적입니다. SQL, 마침표에서 NULL을 피하십시오.실제로, 그의 SQL과 관계 이론의 제4장은 다음과 같습니다. 정확한 SQL 코드 작성 방법은 "NO DUPLICATES, NO NULLS"라는 제목으로 "4.4 NULLs의 문제?" 및 "4.5 SQL의 NULLs 회피" 하위 장에서 확인할 수 있습니다(링크를 따라가면 Google Books 덕분에 온라인에서 일부 페이지를 읽을 수 있습니다).

SQL NULL의 Fabian Pascal

데이터베이스 관리의 실천적 문제 - 사고 실무자를 위한 참고 자료(온라인에서 발췌한 내용은 없습니다.죄송합니다.

10.3 문법의 의미

10.3.1 SQL의 특수한 순서

... SQL은 3VL에 내재된 문제뿐만 아니라 많은 문제, 복잡성, 반직관성 및 명백한 오류[10, 11]로 인해 어려움을 겪고 있습니다.이러한 문제는 다음과 같습니다.

  • 집약 함수(SUM(), AVG() 등)는 NULL을 무시합니다(COUNT() 제외).
  • 행이 없는 테이블의 스칼라 표현식은 0이 아닌 NULL로 잘못 평가됩니다.
  • 표현식 "NULL = NULL"은 NULL로 평가되지만 실제로는 SQL에서 유효하지 않습니다. 그러나 ORDER BY는 NULL을 동등하게 취급합니다("일반" 값 앞이나 뒤에 오는 값은 DBMS 공급업체에 맡겨집니다.
  • 표현식 "x IS NOT NULL"은 2VL의 경우와 같이 "NOT(x IS NULL)"과 동일하지 않습니다.

...

상용 SQL 방언은 모두 이 3VL 방식을 따르기 때문에 이러한 문제를 해결할 뿐만 아니라 제품에 따라 다른 특정 구현 문제도 있습니다.

이 답변은 모두 CS 관점에서 나온 것 같기 때문에 개발자 관점에서 추가하겠습니다.

개발자에게 NULL은 매우 유용합니다.여기 답변에 따르면 NULL은 알 수 없는 것을 의미합니다. CS 이론상으로는 그건 사실일 수도 있습니다.기억이 안 나네요.오랜만이네요그러나 실제 개발에서는 적어도 제 경험상으로는 약 1% 정도 그런 일이 일어납니다.나머지 99%는 값을 알 수 없지만 존재하지 않는 것으로 알려진 경우에 사용됩니다.

예를 들어 다음과 같습니다.

  • Client.LastPurchase클라이언트의 는, 「」를 참조해 주세요모르는 게 아니라 아직 구매하지 않은 것으로 알려져 있습니다.

  • ORM을 Table per Class Hierarchy 매핑과 함께 사용할 경우 일부 값은 특정 클래스에 매핑되지 않습니다.

  • 트리 구조를 매핑할 때 일반적으로 루트는Parent = NULL

  • 그리고 더 많은...

대부분의 개발자들은 언젠가 이렇게 썼을 겁니다.WHERE value = NULLIS NULL구문을 사용합니다.이 질문과 링크된 질문이 얼마나 많은지 보세요.

SQL 데이터베이스는 도구이며 사용자가 가장 쉽게 이해할 수 있도록 설계해야 합니다.

당신이 두 가지가 무엇인지 모른다고 해서, 그것들이 동등하다는 것을 의미하지는 않는다.만약 당신이 생각난다면NULL'NULL의 'NULL'(NULL)과 같은 수 .IS DISTINCT FROM 리 and 。IS NOT DISTINCT FROM

포스트그레에서"비교 함수연산자"에 대한 SQL 문서

expressIS DISTINCT FROM

expressIS NOT DISTINCT FROM

이외의 입력의 경우 Null " " " " 입니다.IS DISTINCT FROM요.<>하고 한쪽 true를합니다.,, 양인인 null 、 false 를를 、 를인인 인인 、 null 、 true 、 를를를를를 。similarly유 similarly,, similarly 、IS NOT DISTINCT FROM is is is is is is 와 같다=이 값은 두 입력 모두 null일 경우 true를 반환하고 한 입력만 null일 경우 false를 반환합니다.따라서 이러한 구조는 "알 수 없음"이 아니라 null이 일반 데이터 값인 것처럼 효과적으로 작동합니다.

따라 다르겠지만, 했지.NULL=NULLNULL늘(NULL)

technet에서는 null 값이 어떻게 동작하는지에 대한 좋은 설명이 있습니다.

Null은 알 수 없음을 의미합니다.

따라서 부울식은

value = 표시

는 false로 평가되지 않고 null로 평가되지만 where 구의 최종 결과일 경우 아무것도 반환되지 않습니다.그것이 실용적인 방법이다. 왜냐하면 무효를 되돌리는 것은 상상하기 어렵기 때문이다.

다음 사항을 이해하는 것은 매우 중요하며 흥미롭고 매우 중요합니다.

쿼리에서 다음 항목이 있는 경우

where (value=@param Or @param is null) And id=@anotherParam

그리고.

  • 값=1
  • @syslog는 null입니다.
  • id=123
  • @another Param=123

그리고나서

는 null"value=@syslog"null로 됩니다.
null"은 "@sysis is null"로됩니다.
"은 참 "id=@anotherParam"으로

그래서 평가할 표현은

(null 또는 true) 그리고 true

여기서 "null Or true"가 null로 평가되어 식 전체가 null이 되어 행이 반환되지 않는다고 생각할 수 있습니다.

그렇지 않아요. 왜요?

"null Or true"는 매우 논리적인 true로 평가되기 때문에 한쪽 오퍼랜드가 Or-operator에서 true이면 다른 쪽 오퍼랜드의 값에 관계없이 true가 반환되기 때문입니다.따라서 다른 피연산자가 불분명한(늘) 것은 문제가 되지 않습니다.

그러면 드디어 true=true가 되므로 행이 반환됩니다.

주의: "null Or True"가 true로 평가되는 것과 같은 명확한 논리로 "null And true"는 null로 평가됩니다.


의 내용들과 더 해 보겠습니다.

"null Or false"는 null, "null And false"는 false로 평가됩니다.:)

물론 그 논리는 여전히 예전처럼 자명하다.

MSDN에는 늘과 늘이 일으키는3가지 스테이트 로직이 기술되어 있습니다.

즉, SQL92 사양에서는 NULL을 알 수 없는 것으로 정의하고 있으며, 다음 연산자에서 NULL을 사용하면 미개시자에게 예기치 않은 결과가 발생합니다.

= operator NULL   true   false 
NULL       NULL   NULL   NULL
true       NULL   true   false
false      NULL   false  true

and op     NULL   true   false 
NULL       NULL   NULL   false
true       NULL   true   false
false      false  false  false

or op      NULL   true   false 
NULL       NULL   true   NULL
true       true   true   true
false      NULL   true   false

NULL의 개념은 아무리 좋게 말해도 의문입니다.Codd는 관계형 모델과 컨텍스트에서의 NULL 개념을 도입했습니다(그리고 여러 종류의 NULL을 제안했습니다).그러나 관계 이론은 Codd의 원저작 이후 발전했다. 그의 제안 중 일부는 폐기되었고(예: 기본 키), 다른 것들은 전혀 받아들여지지 않았다(예: Theta 연산자).현대의 관계 이론(진짜로 강조해야 할 관계 이론)에서는 NULL은 단순히 존재하지 않는다.제3의 선언을 참조하라.http://www.thethirdmanifesto.com/

SQL에 있습니다.NULL SQL을 사용합니다.의 틀림없습니다.NULL이 있습니다( Server으로 인해 Server 구현이 더 ).ANSI_NULLS옵션)을 클릭합니다.

기본 테이블에서 NULLable 열을 사용하지 않는 것이 좋습니다.


는 안 될 것 , 는 단지 해야 하는가에 제 뿐입니다.NULLSQL 서 sql 。

NULL=NULLUNKNOWN.

UNKNOWN을 사용하다

NULL을 사용하다

이것은 증명하기 쉽다.

SELECT NULL = NULL

"SQL Server" 입니다. 그 값이었다면, 그 결과를 할 수 있을 것입니다.NULL여기 (주문)의 몇 가지 답변이 시사하는 바와 같이.

「」UNKNOWNSQL DML SQL DDL입니다.

DML에서는 SQL DML입니다.UNKNOWN이치노

예를 들어 다음과 같습니다.

CREATE TABLE MyTable
(
 key_col INTEGER NOT NULL UNIQUE, 
 data_col INTEGER
 CHECK (data_col = 55)
);

INSERT INTO MyTable (key_col, data_col)
   VALUES (1, NULL);

INSERT단, 이 행은 성공합니다.CHECK가 해결되다NULL = NULLSQL-92('ANSI')로 지정됩니다.

11.6 테이블 구속조건 정의

3)

테이블 제약조건이 체크 제약조건 정의인 경우 SC를 체크 제약조건 정의에 즉시 포함된 검색조건으로 하고 T를 대응하는 테이블 제약조건 기술자에 포함된 테이블명으로 합니다.테이블 제약조건은 다음과 같은 경우에만 충족되지 않습니다.

존재 (* FROM * WHERE NOT ( SC )에서 선택)

정말이에요.

논리에 따라 다시 한 번 주의 깊게 읽어보세요.

영어로,은 '이점.UNKNOWN통과를 허락받았습니다.

DML에서 DML의 입니다.WHERE을 사용법

검색 조건은 T의 각 행에 적용됩니다.where 구의 결과는 검색 조건의 결과가 true인T 행의 테이블입니다.

평이한 영어로 평가된 행은 다음과 같습니다.UNKNOWN결과 세트에서 삭제됩니다.

★★★★★★★★★★★★★★★★★★NULL는 '최소값'을 의미하며 알 수 없는 두 값은 같을 수 없습니다.

우리 NULL은 N°1과 .NULLN°2는 N°2로 하다

SELECT 1
WHERE ISNULL(nullParam1, -1) = ISNULL(nullParam2, -1)

의 값 「」은, 「」입니다.-1은 N°1과 .-1N°2

NULL은 그 어떤 것과도 동등하지 않습니다.NULL의 동작을 이해하기 위한 나의 개인적인 해결책은 NULL의 사용을 가능한 한 피하는 것입니다:).

★★★★
른의른른른른른른른른른른른른른른?
NULL =NULL = NULL)
이 질문은 아무도 대답할 수 없기 때문에 기본적으로는 ansi_nulls 설정에 따라 true 또는 false로 설정됩니다.

,, 음, 음, 음, 음, 음, 음, however, however, however, however, however.
네, 이렇게요.
이 질문은 상당히 다르며 사실로 대답할 수 있다.

=이 값 nullVariable = null을 .
은 variablenullVariable null 하는 것입니다.

혼란은 NULL을 사용함으로써 발생하는 간접(추상) 수준에서 발생합니다.

"크리스마스 트리 아래에 있는 것"의 비유로 돌아가서, "알 수 없는 것"은 박스 A에 있는 것에 대한 지식 상태를 나타냅니다.

상자 A에 무엇이 들어있는지 모르면 "Unknown"이라고 하지만 "Unknown"이 상자 안에 있다는 의미는 아닙니다.알 수 없는 것 이외의 것이 상자 안에 들어 있거나, 어떤 물건일 수도 있고, 상자 안에 아무것도 들어 있지 않을 수도 있습니다.

마찬가지로 상자 B에 무엇이 있는지 모를 경우 내용에 대한 지식 상태를 "알 수 없음"으로 레이블링할 수 있습니다.

여기서 중요한 것은 박스 A에 대한 지식 상태는 박스 B에 대한 지식 상태와 동일합니다(두 경우 모두 "알 수 없음" 또는 "박스 안에 무엇이 들어 있는지 모릅니다").하지만 상자의 내용물은 같을 수도 있고 아닐 수도 있습니다.

SQL로 돌아가서 값을 비교할 수 있는 것은 값을 알아야 합니다.불행하게도, 지식의 부족을 나타내는 라벨은 셀 자체에 저장되어 있기 때문에 우리는 그것을 가치로 사용하고 싶다.그러나 이 값을 값으로 사용하면 안 됩니다.왜냐하면 "A상자의 내용이 B상자의 내용과 같거나 B상자의 내용을 모르는 경우" (논리적으로 "A상자의 내용을 모르는 경우 및 A상자의 내용을 모르는 경우"라는 의미입니다.

야호, 데드호스.

WHERE 절에는 NULL = NULL 비교를 처리하는 두 가지 합리적인 방법이 있으며, 이는 "NULL이란 무엇을 의미합니까?"로 요약됩니다. 한 가지 방법은 NULL이 "data"를 의미한다고 가정하고 다른 방법은 NULL이 "data does not existing"을 의미한다고 가정합니다.SQL은 잘못된 세 번째 방법을 선택했습니다.

"NULL은 알 수 없는" 솔루션을 의미합니다. 에러를 던지다.

알 수 없음 = 알 수 없음은 3VL null로 평가해야 합니다.그러나 WHERE 절의 출력은 2VL입니다. 행을 반환하거나 반환하지 않습니다.이는 0으로 나누어 숫자를 반환하도록 요구받는 것과 같습니다.올바른 응답이 없습니다.그 대신 오류를 던져 프로그래머가 이 상황을 명시적으로 처리하도록 합니다.

"NULL은 데이터가 없음을 의미합니다." 솔루션은 다음과 같습니다. 행을 반환합니다.

데이터 없음 = 참으로 평가해야 하는 데이터가 없습니다.만약 두 사람을 비교한다면, 그들은 같은 이름과 성을 가지고 있고, 중간 이름도 없다면, "이 사람들은 같은 이름을 가지고 있다."라고 말하는 것이 옳다.

SQL 솔루션: 행을 반환하지 마십시오.

이것은 항상 잘못된 것이다.NULL이 "알 수 없음"을 의미할 경우 행을 반환해야 하는지 여부를 알 수 없으므로 추측하지 마십시오.NULL이 "데이터 없음"을 의미할 경우 행을 반환해야 합니다.어느 쪽이든 행을 사일런트하게 삭제하는 것은 잘못되어 문제가 발생합니다.둘 다 최악이야

이론을 제쳐두고 실제적인 용어로 말하면, 저는 AlexDev와 함께 합니다.저는 "Return the Row"가 바람직한 결과가 아닌 경우를 거의 본 적이 없습니다.그러나 "거의 없다"는 것은 "절대 없다"가 아닙니다. SQL 데이터베이스는 종종 크고 중요한 시스템의 백본 역할을 하기 때문에 엄격하고 오류를 발생시키는 적절한 사례를 볼 수 있습니다.

보이지 않는 것은 3VL null을 2VL false로 사일런트 강제하는 경우입니다.대부분의 조용한 형태의 강압과 마찬가지로, 그것은 당신의 몸속에서 풀려나기를 기다리는 광적인 족제비이다. 그리고 족제비가 마침내 튀어나와 누군가를 물면, 당신은 그것을 자신의 둥지로 다시 추적하는 즐거운 시간의 악마를 갖게 될 것이다.

null은 sql에서 알 수 없기 때문에 알 수 없는 두 개의 값은 같을 수 없습니다.

그러나 ANSI_NULLS를 꺼짐(기본적으로 켜짐)으로 설정하면 이러한 동작을 얻을 수 있습니다. null에 대해 = 연산자를 사용할 수 있습니다.

SET ANSI_NULLS off
if null=null
print 1
else 
print 2
set ansi_nulls on
if null=null
print 1
else 
print 2

당신은 시민 정보를 등록하는 정부에서 일합니다.이것은 그 나라의 모든 사람들의 국민 ID를 포함합니다.약 40년 전 아이가 교회 문 앞에 버려져 부모가 누구인지 아무도 모른다. 사람의 는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」NULL을 사용하다적어도 한 명의 다른 사람(남매인 사람)과 동일한 아버지 ID를 공유하는 사람을 계산합니다.그그 두? ???

정답은 '아니다'입니다. 왜냐하면 우리는 그들이 형제인지 아닌지 모르기 때문입니다.

를 들어, '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.NULL대신 미리 결정된 값을 사용하여 빈 문자열 또는 숫자 0 또는 * 문자 등을 나타낼 수 있습니다.그러면 쿼리에 * = *, 0 = 0, " = " 등이 포함됩니다. 것이 수 의 입니다), 할 수 있는 합니다. 그리고 당신은 종종 이러한 경우를 잊어버릴 수 있습니다(위의 예는 일상적인 사고 이외의 명백한 변두리 사례입니다). 그러면 당신은 당신을 위해 그것을 기억할 언어가 필요합니다.NULL = NULL실이아아 아아아다다

필요는 발명의 어머니이다.

크리스마스 유추를 다시 한 번 인용하자면:

SQL에서 NULL은 기본적으로 "닫힌 상자"(알 수 없음)를 의미합니다.따라서 두 개의 닫힌 상자를 비교한 결과도 알 수 없습니다(늘).

개발자에게 있어서 이것은 직관에 반하는 것입니다.왜냐하면 프로그래밍 언어에서 NULL은 오히려 "상자"(알려진)를 의미하기 때문입니다.그리고 두 개의 빈 상자를 비교하는 것은 자연스럽게 참/동일하게 됩니다.

가 JavaScript를 구별하는 입니다.null ★★★★★★★★★★★★★★★★★」undefined.

기타 훌륭한 답변 추가:

AND: The result of true and unknown is unknown, false and unknown is false,
while unknown and unknown is unknown.

OR: The result of true or unknown is true, false or unknown is unknown, while unknown or unknown is unknown.

NOT: The result of not unknown is unknown

2개의 NULL에 대해 true를 반환하는 식을 찾고 있는 경우 다음을 사용할 수 있습니다.

SELECT 1 
WHERE EXISTS (
    SELECT NULL
    INTERSECT
    SELECT NULL
)

한 테이블에서 다른 테이블로 데이터를 복제하려는 경우 유용합니다.

예를 들어, 케이스 스테이트먼트 when 절의 동등성 테스트는 다음에서 변경할 수 있습니다.

XYZ = NULL 

로.

XYZ IS NULL

공백 및 빈 문자열을 NULL과 동일하게 취급하려면 다음과 같은 동등성 테스트를 사용하는 경우가 많습니다.

(NULLIF(ltrim( XYZ ),'') IS NULL)

Null은 자신을 포함한 모든 것과 같지 않습니다. 개체가 Null인지 여부를 테스트하는 가장 좋은 방법은 null이 자신과 동일하지 않은 유일한 개체이기 때문에 개체와 동일한지 여부를 확인하는 것입니다.

const obj = null

console.log(obj==obj) //false, 그러면 null입니다.

이 기사를 확인해 주세요.

언급URL : https://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql-server

반응형