이전 개발자가 작성한 코드를 작성 중이며 쿼리에서 다음과 같이 말합니다.
WHERE p.name <=> NULL
<=>
이 쿼리에서 무엇을 의미합니까? 그것은 동등한 것 =
입니까? 아니면 구문 오류입니까?
그러나 오류나 예외는 표시되지 않습니다. 나는 이미 MySQL 에서 <>
= !=
를 알고있다 .
이전 개발자가 작성한 코드를 작성 중이며 쿼리에서 다음과 같이 말합니다.
WHERE p.name <=> NULL
<=>
이 쿼리에서 무엇을 의미합니까? 그것은 동등한 것 =
입니까? 아니면 구문 오류입니까?
그러나 오류나 예외는 표시되지 않습니다. 나는 이미 MySQL 에서 <>
= !=
를 알고있다 .
답변:
그것은의 NULL
안전과 동일 연산자.
정규 =
연산자 와 같이 두 값이 비교되고 결과는 0
(같지 않음) 또는 1
(같음)입니다. 다른 말로 'a' <=> 'b'
하면 yields 0
and 'a' <=> 'a'
yields 1
입니다.
정규 =
연산자 와 달리 값은 NULL
특별한 의미가 없으므로 NULL
가능한 결과를 얻지 못합니다 . 그래서 : 'a' <=> NULL
수율 0
및 NULL <=> NULL
수율 1
.
이것은 두 피연산자 모두를 포함 할 수 있고 두 열간 NULL
에 일관된 비교 결과가 필요할 때 유용 할 수 있습니다 .
또 다른 유스 케이스는 다음과 같이 준비된 명령문입니다.
... WHERE col_a <=> ? ...
여기서 자리 표시자는 스칼라 값이거나 NULL
쿼리에 대한 내용을 변경할 필요가 없습니다.
게다가 <=>
에 대해 비교하는 데 사용할 수있는 두 개의 다른 연산자도있다 NULL
, 즉,IS NULL
및 IS NOT NULL
; 그것들은 ANSI 표준의 일부이므로 <=>
MySQL 과는 달리 다른 데이터베이스에서 지원됩니다 .
당신은 그것들을 MySQL의 전문화로 생각할 수 있습니다 <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
이를 바탕으로 특정 쿼리 (조각)를보다 이식성있게 변환 할 수 있습니다.
WHERE p.name IS NULL
SQL : 2003 표준은 이것에 대한 술어를 도입했으며, 이는 MySQL의 <=>
연산자 와 정확히 다음과 같은 형식으로 작동합니다.
IS [NOT] DISTINCT FROM
다음은 보편적으로 지원되지만 상대적으로 복잡합니다.
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
<=>
다소 쓸모없는 연산자입니까? 권리?
<=>
두 개의 피연산자가 필요하지만 IS (NOT) NULL
하나의 피연산자 가 필요합니다. 큰 차이는 ... 그 측면에서만큼 유용합니다 =
.
IS NULL
및 IS NOT NULL
SQL 표준에 있습니다. <=>
MySQL 특정 확장명입니다.
is not distinct from
연산자 처럼 . MySQL은 ... 그에 인덱스를 사용할 수 있는지 알고 있어요
a <=> b
입니다 NOT(a <=> b)
.
이다 <=> NULL-safe equal to operator
이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.
여기를 참조하십시오 설명서는
샘플 :
IS NOT NULL을 사용해야합니다. (비교 연산자 =와 <>는 둘 다 표현식의 양쪽에 UNKNOWN을 NULL로 제공합니다.)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
널 안전 동등 연산자를 무시할 수도 있지만 이는 표준 SQL이 아닙니다.
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
그것은 인 NULL 안전한 동등 연산자
<=> 연산자는 NULL 값을 필드와 비교하는 데 사용됩니다. 정상 = (같음) 인 경우 비교 값 중 하나가 NULL 인 경우 연산자는 NULL을 리턴합니다. <=> 연산자를 사용하면 true 또는 false가 반환됩니다. <=> 연산자는 IS NULL과 같습니다.
매뉴얼에서 :-
<=>
= 연산자와 같은 항등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
편집 : - ( 매우 늦게 언급 한 가지 중요한 측면 메모를 추가 할 수 있지만 하지 <=> 뿐만 아니라 )
참고 사항 :-
NOT <=>의 요점이 하나 더 있습니다필드와 NULL 값을 비교하는 데 사용되는 있습니다. 정상인 경우! = 또는 <> (같지 않음) 비교 값 중 하나가 NULL 인 경우 연산자는 NULL을 반환합니다. NOT을 <=>에 적용하면 연산자가 true 또는 false를 반환합니다. <=> 연산자에 적용되지 않음은 IS NOT NULL과 같습니다.
예:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
NOT <=>
연산자가 아니며 NOT
의 결과에 적용됩니다 op1 <=> op2
.
<!=>
연산자 가 없다고 생각합니다
NULL 안전 동등 이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
의의 :
NULL 값과 NULL이 아닌 값을 비교하면 NULL이됩니다. 값이 널인지 확인하려는 경우.
Equal 연산자 (<=>)는 NULL을 일반 값으로 간주하므로 두 값이 모두 NULL이면 1 (NULL 아님)을 반환하고 값 중 하나가 NULL이면 0 (NULL 아님)을 반환합니다.
예 :
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
<=>
은 IS NULL 안전한 동등 연산자 . a <=> b
쓰기와 동일합니다.
CASE
WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
WHEN a IS NULL OR b IS NULL THEN 0 -- one operand is null then 0
ELSE a = b -- else behave like normal = operator
END
죄송합니다 AND/OR IS (NOT) NULL
. 이 연산자를 대신 사용해야하는 적절한 이유를 찾지 못했습니다 . 예를 들어, 예 WHERE p.name <=> NULL
는 WHERE p.name IS NULL
입니다.
로부터 MySQL의 문서 :
NULL 안전 동등 이 연산자는 = 연산자와 같은 동등 비교를 수행하지만 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고 하나의 피연산자가 NULL이면 NULL 대신 0을 반환합니다.
<=>
연산자 를 사용하는 예 는 다음과 같습니다.
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
다음을 반환합니다.
1, 1, 0
정규 =
연산자 의 예는 다음과 같습니다.
SELECT 1 = 1, NULL = NULL, 1 = NULL;
다음을 반환합니다.
1, NULL, NULL
<=>
연산자는 매우 비슷합니다 =
제외하고, 운영자 <=>
반환하지 않습니다NULL
NULL-안전한 안전 연산자입니다. 설명을 확인하십시오 .
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
+----+------+----+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | NULL | 3 | NULL |
| 4 | NULL | 3 | NULL |
| 3 | NULL | 4 | NULL |
| 4 | NULL | 4 | NULL |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
spaceship
운영자