[tsql] T-SQL CASE 절 : WHEN NULL을 지정하는 방법

나는 이와 비슷한 T-SQL 문을 썼다 (원래는 다르게 보였지만 여기에 쉬운 예를주고 싶다) :

SELECT first_name +
    CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person

이 문장에는 구문 오류가 없지만 case-clause는 항상 last_name이 null 인 경우에도 ELSE 부분을 선택합니다. 그런데 왜?

내가하고 싶은 것은 first_name과 last_name을 결합하는 것이지만 last_name이 null이면 전체 이름이 null이됩니다.

SELECT first_name +
   CASE last_name WHEN null THEN '' ELSE ' ' + last_name END AS Name
FROM dbo.person

문제가 어디 있는지 아십니까?



답변

CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END


답변

WHEN 부분은 ==와 비교되지만 실제로 NULL과 비교할 수는 없습니다. 시험

CASE WHEN last_name is NULL  THEN ... ELSE .. END

대신 또는 COALESCE :

COALESCE(' '+last_name,'')

( ‘last_name이 NULL 인 경우’ ‘+ last_name은 NULL이므로이 경우’ ‘를 반환해야합니다.)


답변

많은 해결책이 있지만 원래 진술이 효과가없는 이유는 다루지 않습니다.

CASE last_name WHEN null THEN '' ELSE ' '+last_name

그 후, 평등에 대한 점검이 있으며, 이는 참 또는 거짓이어야합니다.

비교의 하나 또는 두 부분이 모두 널인 경우, 비교 결과는 알 수 없음이며 케이스 구조에서 false로 처리됩니다. 참조 : https://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/

이를 피하기 위해 Coalesce가 최선의 방법입니다.


답변

쿼리가 주어지면 다음과 같이 할 수도 있습니다.

SELECT first_name + ' ' + ISNULL(last_name, '') AS Name FROM dbo.person


답변

문제는 널 (null)이 자신과 동일하게 간주되지 않기 때문에 절이 일치하지 않는다는 것입니다.

널을 명시 적으로 확인해야합니다.

SELECT CASE WHEN last_name is NULL THEN first_name ELSE first_name + ' ' + last_name


답변

시험:

SELECT first_name + ISNULL(' '+last_name, '') AS Name FROM dbo.person

이렇게하면성에 공백이 추가되고, 널 (null)이면 전체 space + 성은 NULL이되고 이름 만 얻습니다. 그렇지 않으면 firts + space + 성을 얻습니다.

null 문자열과의 연결에 대한 기본 설정이 설정되어 있으면 작동합니다.

SET CONCAT_NULL_YIELDS_NULL ON 

OFF이후 버전의 SQl Server에서는 모드가 사라 지기 때문에 걱정할 필요가 없습니다.


답변

문제는 NULL이 자체와 다른 것으로 간주되지 않지만 이상한 부분은 자체와 동일 하지 않다는 것입니다.

다음 문장을 고려하십시오 (SQL Server T-SQL에서는 BTW가 불법이지만 My-SQL에서는 유효하지만 ANSI가 null을 정의하는 것이므로 SQL 문에서도 대소 문자를 사용하여 확인할 수 있습니다).

SELECT NULL = NULL -- Results in NULL

SELECT NULL <> NULL -- Results in NULL

따라서 질문에 대한 참 / 거짓 답변이 없으며 대신 답도 null입니다.

예를 들어

  1. 명시 적으로 사용하지 않는 경우에 null 값이 항상 ELSE 절을 사용하는 CASE 문은, 언제 NULL 조건 (IS NOT 조건 )WHEN NULL
  2. 문자열 연결
    SELECT a + NULL -- Results in NULL
  3. WHERE IN 또는 WHERE NOT IN 절에서, 올바른 결과를 원하는 것처럼 상관 부속 조회에서 널값을 필터링하도록하십시오.

을 지정하여 SQL Server에서이 동작을 무시할 수 SET ANSI_NULLS OFF있지만 그렇지 않습니다. 권장하고 많은 문제가 발생할 수해서는 안 단순히 때문에 표준 편차.

참고로 My-SQL에는 <=>null 비교를 위해 특수 연산자를 사용하는 옵션이 있습니다 .

비교해 보면, 일반 프로그래밍 언어에서 null 처리는 정규 값이며 자체와 동일하지만 NAN 값은 자체와 동일하지 않지만 적어도 자체와 비교할 때 ‘false’를 반환합니다. 다른 프로그래밍 언어가 다른 구현 언어를 가지고 있는지 확인하십시오).

그러나 기본 언어 (예 : VB 등)에는 ‘null’키워드가 없으며 대신 ‘Nothing’키워드를 사용합니다.이 키워드는 직접 비교에 사용할 수 없으며 대신 SQL에서 ‘IS’를 사용해야합니다. 그러나 실제로는 (간접 비교를 사용할 때) 자체와 같습니다.