[SQL] ISNULL NULL의 대
SQLISNULL NULL의 대
나는 형태의 제한을 사용하는 직장 및 SO에 대한 쿼리의 숫자를 발견했습니다 :
isnull(name,'') <> ''
사람이 아닌 더 간결한을 왜 특별한 이유가 있나요
name is not null
그것은 기존 또는 성능 문제인가?
해결법
-
==============================
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.
is not null
필드가 null가 아닌 경우에만 확인합니다. 필드가 빈 문자열을 포함하는 경우, 다음 필드는 더 이상 널 (null)입니다.
isnull(name, '') <> name
널과 빈 문자열을 모두 확인합니다.
-
==============================
3.ISNULL (이름, '') <> : (이 같은 shorthands 나쁜 될 수 있습니다 따라서 왜 이름은 결코 빈 문자열을 포함하지 않는 것으로 가정) : 이름 (이름 이름이 null 또는 이름 <>이다)에 대한 속기입니다.
ISNULL (이름, '') <> : (이 같은 shorthands 나쁜 될 수 있습니다 따라서 왜 이름은 결코 빈 문자열을 포함하지 않는 것으로 가정) : 이름 (이름 이름이 null 또는 이름 <>이다)에 대한 속기입니다.
성능 현명한, 그것은 의존한다. 조항이 매우 나쁜 성능을 제공 할 수있는 또는 문. 그러나 열하게 손상 인덱스 사용에 대한 기능을합니다. 프로필 : 평소처럼.
-
==============================
4.
isnull(name,'') <> name
그럼 난 이름이 널 (null)을 일치하거나하지 않으며이 방법 경우 실패한 비교 반환하기 때문에 그들이이를 사용하여 볼 수 있습니다. 이건 정말 의미 : 이름은 null 또는 이름 <> 이름입니다
이 하나의 이름이 null이 같은 이름이 null 인 경우 어디에서 바로 확인합니다.
-
==============================
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.나는 분명히 당신의 질문을 오해. 그래서 내 첫 번째 대답을 공격하고이 일을 해보자 :
나는 분명히 당신의 질문을 오해. 그래서 내 첫 번째 대답을 공격하고이 일을 해보자 :
isnull(name,'') <> ''
오도 바로 가기입니다
name is not null and name <> ''
-
==============================
7.다른 사람들은 기능적인 차이를 지적했다. 오, 내가 포스트 그레스 함수 다른 SQL 방언에있는 "ISNULL"하는 것과 동일 "병합"을 가지고 언급해야 - - 성능 문제에 관해서는, 포스트 그레스에서 나는 것으로 나타났습니다하지만 포스트 그레스의 말
다른 사람들은 기능적인 차이를 지적했다. 오, 내가 포스트 그레스 함수 다른 SQL 방언에있는 "ISNULL"하는 것과 동일 "병합"을 가지고 언급해야 - - 성능 문제에 관해서는, 포스트 그레스에서 나는 것으로 나타났습니다하지만 포스트 그레스의 말
where coalesce(foobar,'')=''
속도가 매우 빠르고보다
where foobar is null or foobar=''
또한, 놀랍도록 극적으로 빠르게 말을하는 수
where foobar>''
위에
where foobar!=''
A-동일하지 테스트가 전체 파일 읽기를 수행하는 동안 테스트보다 더 큰는 모든 공백을 건너 따라서 인덱스를 사용할 수 있습니다. (당신은 필드에서 인덱스와 다른 인덱스가 우선적으로 사용되지 않습니다이 가정.)
-
==============================
8.당신은 열 사용에 대한 인덱스의 사용을 만들고 싶어 또한 경우
당신은 열 사용에 대한 인덱스의 사용을 만들고 싶어 또한 경우
name is not null and name <> ''
-
==============================
9.이 두 쿼리는 동일하지 않습니다. 예를 들어, 내가 중간 이름이없는,이 저장 될 수있는 알려진 사실이며,
이 두 쿼리는 동일하지 않습니다. 예를 들어, 내가 중간 이름이없는,이 저장 될 수있는 알려진 사실이며,
MiddleName=''
우리가 다른 사람의 중간 이름을 모르는 경우, 우리는 NULL을 저장할 수 있습니다. 그래서, ISNULL (가운데 이름, '') 수단 "알려진 가운데 이름이없는 사람".
-
==============================
10.그것은 빈 문자열과 NULL을 모두 처리하는 것입니다. 그것은 하나의 문으로 할 수있는 것이 좋은 반면, ISNULL 독점 구문입니다. 나는이 사용하는 휴대용 표준 SQL 등을 작성합니다
그것은 빈 문자열과 NULL을 모두 처리하는 것입니다. 그것은 하나의 문으로 할 수있는 것이 좋은 반면, ISNULL 독점 구문입니다. 나는이 사용하는 휴대용 표준 SQL 등을 작성합니다
NULLIF(name, '') IS NOT NULL
from https://stackoverflow.com/questions/3118213/isnull-vs-is-null by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] C #의 WinForm에서의 app.config를 사용하여 데이터베이스 연결 문자열에 액세스 (0) | 2020.07.05 |
---|---|
[SQL] 어떻게 DO 블록에서 선택 쿼리를 수행하기 위해? (0) | 2020.07.05 |
[SQL] SSRS 표현에 '처럼'사용 (0) | 2020.07.05 |
[SQL] WHERE IN 절에서 SQL 사용 CASE 문 (0) | 2020.07.05 |
[SQL] SQL Server의 분 계산 시간 차이 (0) | 2020.07.05 |