ISNULL (), NVL (), IFNULL () 또는 COALESCE ()와 동등한 SQLite


92

내 코드에서 다음과 같은 많은 검사를 피하고 싶습니다.

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

다음과 같은 작업을 수행하여 내 쿼리가 null을 처리하도록 할 수 있다고 생각했습니다.

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

나는 SQLite를 사용하고 있으며 isnull기능 을 인식하지 못하는 것 같습니다 . 나는 또한 다른 데이터베이스 ( NVL(), IFNULL()COALESCE()) 에서 인식되는 동등한 것들을 시도해 보았지만 SQLite는 그들 중 어느 것도 인식하지 못하는 것 같습니다.

누구든지 제안이 있거나 더 나은 방법을 알고 있습니까? 불행히도 데이터베이스에는 모든 필드에 대한 기본값이 없습니다. 또한 테이블에 LEFT JOIN일치하는 레코드가 LEFT JOIN존재하지 않기 때문에 반환 된 필드 중 일부가 null이되는 경우에 일부 절 을 사용해야 합니다.

답변:


130

IFNULL, 여기를 참조하십시오 : http://www.sqlite.org/lang_corefunc.html#ifnull

함수 주위에 대괄호 없음


Bah 대괄호였습니다. 감사합니다. 문서가 지원되었다고 말하고 (또한 거기에 합체가 있음) 나를 미치게했지만 작동하지 않았습니다. 그 날 중 하나 ...
Jason Down

1
"함수 주위에 괄호가 없음"에 대한 설명이 질문을 참조한다는 것을 알고 있지만 이와 같은 설명을 사용하면 초기 설명 아래에 예제가 있으면 도움이 될 것입니다.
palswim

40

이 시도

ifnull(X,Y)  

예 :

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

ifnull()함수는 NULL이 아닌 첫 번째 인수의 복사본을 반환하거나 두 인수가 모두 NULL이면 NULL을 반환합니다. Ifnull()정확히 2 개의 인수가 있어야합니다. 이 ifnull()함수는 coalesce()두 개의 인수와 동일합니다 .


1
네, 제가 ifnull원한다는 걸 알아 냈어요 ... 제가 사용하던 대괄호를 삭제하면 됐어요.
Jason Down

@HardikDarji 일부 downvote 행복한 관리자가 "이 시도"라는 단어를보고 더 이상 읽지 않기 때문입니다. 또는 누군가가 ifnull ()과 coalesce ()의 비교가 잘못되었다고 가정했기 때문에 다른 db 환경에서와 같이 (sqlite가 아닌) 오류가 있습니다. 어쨌든 누가 신경 쓰는지. "사용해보기"답변은 "문서 읽기"답변보다 낫습니다. 나는 매번 답변을 포함하는 비 코드를 훑어 보거나 읽지도 않을 것입니다. 답변 해주셔서 감사합니다!
maplemale

25

ISNULL()메서드 가 없으면 대신 다음 식을 사용할 수 있습니다.

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

이것은 ISNULL(fieldname, 0).


1
이 함수 ifnullisnull질문이 요청한 함수에 해당하는 SQLite 입니다. 지금이 글을 읽고있는 사람에게는 .NET을 사용하여 자신의 솔루션을 작성하기 전에 SQLMenace의 답변 (1 년 반 이상 이전)을 참조하십시오 CASE.
spaaarky21 2014-06-11

1
@ spaaarky21-좋은 지적입니다. 그러나이 답변은 잠재적으로 단위 테스트를 위해 sqlite를 사용하고 라이브 코드에 다른 RDBMS를 사용하는 사람들에게 유용합니다. 이 경우 같은 CASE문을 사용하는 것이 IFNULL.
Seth Flowers

2
@sethflowers 더 RDBMS 중립적 인 방식으로 null 기본값을 구현하는 값을 볼 수 있지만 이것이 다른 질문에 대한 대답입니다. :) OP는 단순히 isnull다른 시스템 에 있는 SQLite와 동등한 것을 요구 하고 있으며 사람들이 "자신의 롤링"을하도록 권장하고 싶지 않습니다.
spaaarky21

"last_name, first_name"을 표시하기 위해 SELECT 절 내에서 문자열 연결에 사용하기 위해 ifnotnull () 또는 ifnonnull ()과 같은 것을 찾고 있었지만 first_name이 null이 아닌 경우에만 쉼표를 연결합니다. 이 접근 방식으로 그렇게 할 수 있습니다.
steve_0804

3

ISNULL () 메서드 대신 WHERE 절에서 IS NULL또는 사용 IS NOT NULL:

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

더 많은 정보로 편집하십시오. 코드 전용 및 "시도"답변은 검색 가능한 콘텐츠가 포함되어 있지 않고 누군가 "이것을 시도"해야하는 이유를 설명하지 않기 때문에 권장하지 않습니다.
abarisone

1
그것은 요청 된 것과 관련이 없습니다. OP는 myField1null이 아닌 값이있는 행을 필터링하지 않고 행 값이 null 인 경우 결과 열의 값을 다른 값으로 바꾸려고합니다.
다니엘 카밀 Kozar

2

NVL () 및 ISNULL ()에 해당하는 경우 다음을 사용하십시오.

IFNULL(column, altValue)

column : 평가중인 열입니다.

altValue : 'column'이 null 인 경우 반환 할 값입니다.

예:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* 참고 : COALESCE () 함수는 다른 데이터베이스와 동일하게 작동합니다.

출처 :


-4

이러한 기능을 쉽게 정의하고 사용할 수 있습니다.

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

또는 동일한 축소 버전 :

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}

4
그것은 SQLite가 아닙니다.
다니엘 카밀 Kozar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.