복붙노트

[SQL] ISNULL NULL의 대

SQL

ISNULL NULL의 대

나는 형태의 제한을 사용하는 직장 ​​및 SO에 대한 쿼리의 숫자를 발견했습니다 :

isnull(name,'') <> ''

사람이 아닌 더 간결한을 왜 특별한 이유가 있나요

name is not null

그것은 기존 또는 성능 문제인가?

해결법

  1. ==============================

    1.

    where isnull(name,'') <> ''
    

    동등

    where name is not null and name <> '' 
    

    이는 결과적으로 동일합니다

    where name <> ''
    

    (이름은 최종 표현이 알 수없는 평가 것이며, 행이 반환하지 않는 것이 NULL 인 경우)

    ISNULL 패턴의 사용은 스캔 결과 및 테스트 아래에서 알 수있는 바와 같이 비효율적 인 것이다.

    SELECT ca.[name],
           [number],
           [type],
           [low],
           [high],
           [status]
    INTO   TestTable
    FROM   [master].[dbo].[spt_values]
           CROSS APPLY (SELECT [name]
                        UNION ALL
                        SELECT ''
                        UNION ALL
                        SELECT NULL) ca 
    
    
    CREATE NONCLUSTERED INDEX IX_TestTable ON dbo.TestTable(name)
    
    GO
    
    
    SELECT name FROM TestTable WHERE isnull(name,'') <> ''
    
    SELECT name FROM TestTable WHERE name is not null and name <> ''
    /*Can be simplified to just WHERE name <> '' */
    

    어떤 당신에게 당신이 필요로하는 실행 계획을 제공해야합니다.

  2. ==============================

    2.

    is not null
    

    필드가 null가 아닌 경우에만 확인합니다. 필드가 빈 문자열을 포함하는 경우, 다음 필드는 더 이상 널 (null)입니다.

    isnull(name, '') <> name
    

    널과 빈 문자열을 모두 확인합니다.

  3. ==============================

    3.ISNULL (이름, '') <> : (이 같은 shorthands 나쁜 될 수 있습니다 따라서 왜 이름은 결코 빈 문자열을 포함하지 않는 것으로 가정) : 이름 (이름 이름이 null 또는 이름 <>이다)에 대한 속기입니다.

    ISNULL (이름, '') <> : (이 같은 shorthands 나쁜 될 수 있습니다 따라서 왜 이름은 결코 빈 문자열을 포함하지 않는 것으로 가정) : 이름 (이름 이름이 null 또는 이름 <>이다)에 대한 속기입니다.

    성능 현명한, 그것은 의존한다. 조항이 매우 나쁜 성능을 제공 할 수있는 또는 문. 그러나 열하게 손상 인덱스 사용에 대한 기능을합니다. 프로필 : 평소처럼.

  4. ==============================

    4.

    isnull(name,'') <> name
    

    그럼 난 이름이 널 (null)을 일치하거나하지 않으며이 방법 경우 실패한 비교 반환하기 때문에 그들이이를 사용하여 볼 수 있습니다. 이건 정말 의미 : 이름은 null 또는 이름 <> 이름입니다

    이 하나의 이름이 null이 같은 이름이 null 인 경우 어디에서 바로 확인합니다.

  5. ==============================

    5.그들은 같은 일을 의미하지 않는다.

    그들은 같은 일을 의미하지 않는다.

    name is not null 
    

    이름 필드가 null의 기록을 위해이 검사

    isnull(name,'') <> name  
    

    그들은을 비교 한에서 사용할 수 있도록이 하나가 빈 문자열에 널 (null) 필드의 값을 변경합니다. 값이 null로, 경우 SQL 서버 (그러나 오라클에서 나는 생각한다)에서는, equlaity 또는 불평등이 내가 가치를 모르는 널 수단 변경할 수 없기 고려되지 않습니다를 비교하는 데 사용되므로 실제 값은 아닙니다. 당신은을 비교 한을 할 때 반드시 널 (null) 레코드가 고려되어 있는지 확인하려는 경우, 당신은 ISNULL 또는 (모든 데이터베이스에서 ISNULL의 doen't 작업으로 사용할 ASCII의 표준 용어입니다) COALESCE해야합니다.

    당신은 무엇을보고해야하는 것은 차이입니다

    isnull(a.name,'') <> b.name  
    

    a.name <> b.name

    ISNULL은 정확한 결과를 얻기 위해 필요한 이유 당신은 이해할 것이다.

  6. ==============================

    6.나는 분명히 당신의 질문을 오해. 그래서 내 첫 번째 대답을 공격하고이 일을 해보자 :

    나는 분명히 당신의 질문을 오해. 그래서 내 첫 번째 대답을 공격하고이 일을 해보자 :

    isnull(name,'') <> ''
    

    오도 ​​바로 가기입니다

    name is not null and name <> ''
    
  7. ==============================

    7.다른 사람들은 기능적인 차이를 지적했다. 오, 내가 포스트 그레스 함수 다른 SQL 방언에있는 "ISNULL"하는 것과 동일 "병합"을 가지고 언급해야 - - 성능 문제에 관해서는, 포스트 그레스에서 나는 것으로 나타났습니다하지만 포스트 그레스의 말

    다른 사람들은 기능적인 차이를 지적했다. 오, 내가 포스트 그레스 함수 다른 SQL 방언에있는 "ISNULL"하는 것과 동일 "병합"을 가지고 언급해야 - - 성능 문제에 관해서는, 포스트 그레스에서 나는 것으로 나타났습니다하지만 포스트 그레스의 말

    where coalesce(foobar,'')=''
    

    속도가 매우 빠르고보다

    where foobar is null or foobar=''
    

    또한, 놀랍도록 극적으로 빠르게 말을하는 수

     where foobar>''
    

    위에

    where foobar!=''
    

    A-동일하지 테스트가 전체 파일 읽기를 수행하는 동안 테스트보다 더 큰는 모든 공백을 건너 따라서 인덱스를 사용할 수 있습니다. (당신은 필드에서 인덱스와 다른 인덱스가 우선적으로 사용되지 않습니다이 가정.)

  8. ==============================

    8.당신은 열 사용에 대한 인덱스의 사용을 만들고 싶어 또한 경우

    당신은 열 사용에 대한 인덱스의 사용을 만들고 싶어 또한 경우

    name is not null and name <> '' 
    
  9. ==============================

    9.이 두 쿼리는 동일하지 않습니다. 예를 들어, 내가 중간 이름이없는,이 저장 될 수있는 알려진 사실이며,

    이 두 쿼리는 동일하지 않습니다. 예를 들어, 내가 중간 이름이없는,이 저장 될 수있는 알려진 사실이며,

    MiddleName=''
    

    우리가 다른 사람의 중간 이름을 모르는 경우, 우리는 NULL을 저장할 수 있습니다. 그래서, ISNULL (가운데 이름, '') 수단 "알려진 가운데 이름이없는 사람".

  10. ==============================

    10.그것은 빈 문자열과 NULL을 모두 처리하는 것입니다. 그것은 하나의 문으로 할 수있는 것이 좋은 반면, ISNULL 독점 구문입니다. 나는이 사용하는 휴대용 표준 SQL 등을 작성합니다

    그것은 빈 문자열과 NULL을 모두 처리하는 것입니다. 그것은 하나의 문으로 할 수있는 것이 좋은 반면, ISNULL 독점 구문입니다. 나는이 사용하는 휴대용 표준 SQL 등을 작성합니다

    NULLIF(name, '') IS NOT NULL
    
  11. from https://stackoverflow.com/questions/3118213/isnull-vs-is-null by cc-by-sa and MIT license