itsource

NULL의 <>!= 연산자가 동일하지 않습니다.

mycopycode 2023. 4. 7. 21:17
반응형

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 NULLnull 값이 아닌 값을 비교하려면<> 'YOUR_VALUE' 값이수 내 NULL인지는 수 값이 NULL이 할 수 .이 NULL 、 이이이이이이 이이이 이이이 。

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

즉, NULL에는 값이 없기 때문에 어떤 값도 NULL과 같을 수 없습니다.

따라서 SQL에는 특수한 IS NULL 술어가 있으며 NULL을 처리하기 위한 IS NULL이 아닙니다.

이 동작은 디폴트(ANSI) 동작입니다.

다음과 같은 경우:

 SET ANSI_NULLS OFF

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

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

SET ANSI_NULLS OFF분명 미래에는 떠나게 될 거야

사용하고 있습니다

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

MyColumn이 NULL인 모든 행 또는 MyColumn이 빈 문자열인 모든 행을 반환합니다.많은 "최종 사용자"에게 NULL과 빈 문자열의 문제는 혼동할 필요성과 이유가 없는 구별입니다.

SQL을 사용하여 평가NULL가 UNKNOWN이 .

★★★★★SELECT * FROM MyTable WHERE MyColumn != NULL ★★★★★★★★★★★★★★★★★」SELECT * FROM MyTable WHERE MyColumn <> NULL0으로 하다

NULL Null 함수는 is Null 입니다.

,을할 수 있습니다.IS연산자를 지정합니다.

NULL의 유일한 테스트는 NULL이거나 NULL이 아니다.평등에 대한 검정은 의미가 없습니다. 왜냐하면 정의상 값이 무엇인지 모르기 때문입니다.

다음은 Wikipedia 기사입니다.

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

NULL 비교 연산자를 사용하여 어떤 값과도 비교할 수 없습니다.NULL = NULL이 false입니다.Null은 값이 아닙니다.IS 연산자는 NULL 비교를 처리하도록 특별히 설계되어 있습니다.

null값이 없거나 알 수 없는 값을 나타냅니다.값이 없는 이유를 특정하지 않기 때문에 애매모호해질 수 있습니다.

다음과 같은 쿼리를 실행한다고 가정합니다.

SELECT *
FROM orders
WHERE delivered=ordered;

즉, 사용자가 찾고 있는 행은ordered그리고.delivered날짜는 같습니다.

둘 중 하나 또는 둘 다 null인 경우 예상되는 것은 무엇입니까?

날짜 중 적어도 하나는 알 수 없기 때문에 두 날짜가 동일하다고 말할 수 없습니다.이것은 또한 두 날짜가 불분명한 경우이기도 하다: 우리가 그것들이 무엇인지조차 모르는데 어떻게 같을 수 있는가?

이러한 이유로, 어떤 표현 처리도null값은 실패해야 합니다.이 경우 일치하지 않습니다.이것은, 다음의 조작을 실시하는 경우에도 마찬가지입니다.

SELECT *
FROM orders
WHERE delivered<>ordered;

다시말씀드리지만어떻게두가치가같지않다고할수있을까요?

SQL에는 결측값에 대한 특정 테스트가 있습니다.

IS NULL

구체적으로는 값을 비교하는 것이 아니라 결측값을 찾아내는 것입니다.

마지막으로,!=오퍼레이터, 제가 아는 한, 실제로는 어느 규격에도 없지만, 매우 폭넓게 지원됩니다.그것은 일부 언어 프로그래머들이 좀 더 편안하게 느끼도록 하기 위해 추가되었다.솔직히, 프로그래머가 어떤 언어를 사용하는지 기억하는데 어려움을 겪는다면, 그들은 출발이 좋지 않다.

값에 변화가 있는지 확인하기 위해 만든 코드를 제안하고 싶습니다.i새로운 가치관이 되고 있습니다.d(순서는 중요하지 않지만) 오래된 것입니다.이 경우 값에서 null로 또는 null로 변경하는 것은 변경이지만 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를 사용하면 다양한 유형에 호환됩니다.

NULL은 아무것도 아닙니다.알 수 없습니다.NULL은 아무것도 같지 않습니다.따라서 SQL 쿼리에서 = NULL 대신 IS NULL이라는 마법 문구를 사용해야 합니다.

http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/5658457/not-equal-operator-on-null

반응형