SQL Server 문자열이 null인지 또는 비어 있는지 확인하는 방법


225

데이터를 확인하고 싶지만 null이거나 비어 있으면 무시하십시오. 현재 쿼리는 다음과 같습니다.

Select              
Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id      

그러나 빈 문자열이고 null 인 경우 company.OfferText 를 얻고 싶습니다 listing.Offertext.

가장 성능이 좋은 솔루션은 무엇입니까?

답변:


433

나는 이것을 생각 해요:

SELECT 
  ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text
FROM ...

가장 우아한 솔루션입니다.

그리고 의사 코드로 조금 세분화하려면 :

// a) NULLIF:
if (listing.Offer_Text == '')
  temp := null;
else
  temp := listing.Offer_Text; // may now be null or non-null, but not ''
// b) ISNULL:
if (temp is null)
  result := true;
else
  result := false;

1
나는 그가 먼저 대답 한 것 같지만 당신의 대답이 편집 된 후에 편집 되었기 때문에 당신의 대답이나 unclefofa를 옹호해야하는지 결정할 수 없었습니다. 나는 둘 다 upvoting했다.
— Zecc

listing.Offer_Text = ''이면 NULLIF 조건을 전달합니다. 나는 슬프다.
— Merritt

company.Offer_Text가 null이 아니라면 상황이 복잡해집니다 ... =)
— Coops

3
모든 것이 계획대로 진행되도록 트림을 사용해서는 안됩니다
— irfandar

5
@irfandar-음, 모든 공백이있는 문자열을 비우려면 트리밍을 사용하십시오. 그렇지 않으면 모든 공백이있는 문자열이 비어 있지 않습니다.
— Martin Ba

53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

이 예에서 listing.OfferTextNULL 인 경우 LEN () 함수도 NULL을 반환해야하지만 여전히 0보다 크지 않습니다.

최신 정보

나는 이것을 게시 한 후 5 1/2 년 동안 몇 가지를 배웠으며 지금은 크게 다르게 행동합니다.

COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '')

이것은 허용되는 답변과 비슷하지만 Company.OfferTextnull 인 경우 에도 대체 가 있습니다. 다른 현재 답변 중 어느 것도이 NULLIF()작업을 수행하지 않습니다.


이것은 오늘 상향 조정되었으므로 어딘가에 색인됩니다. 나는 이제 원래의 대답보다 이것을하는 더 좋은 방법을 알고 있습니다.
— Joel Coehoorn

34
Select              
CASE
    WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText
    ELSE COALESCE(Company.OfferText, '')
END As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

18

또 다른 해결책은 다음과 같습니다.

SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, 
FROM   tbl_directorylisting listing 
       INNER JOIN tbl_companymaster company 
         ON listing.company_id = company.company_id

14

ISNULL알려진 출력에 대해 답변을 사용 하고 확인할 수 있습니다 .

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST

12

SQL Server 2012 IIF에서는 예를 들어 다음과 같이 사용할 수 있습니다.

SELECT IIF(field IS NULL, 1, 0) AS IsNull

필드가 비어 있는지 확인할 수있는 것과 같은 방법입니다.


6

LEN 함수를 사용하여 널 또는 빈 값을 점검하십시오. LEN (@SomeVarcharParm)> 0 만 사용할 수 있습니다. 값이 NULL, ''또는 ''이면 false를 반환합니다. LEN (NULL)은 NULL을 반환하고 NULL> 0은 false를 반환하기 때문입니다. 또한 LEN ( '')은 0을 반환합니다.

SELECT 
 CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END,
 CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END,
 CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END,
 CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END,
 CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END

"... LEN (NULL)은 NULL을 반환하고 NULL> 0은 false ...를 반환합니다"라고 말할 때, 실제 규칙은 NULL을 가진 모든 테스트 또는 비교가 NULL을 반환한다는 것입니다!
— Didier68

주목할 가치는 있지만, 비교가 널을 올바른 부울로 통합하기 때문에 단축키로 작동하므로 null 또는 비어있는 경우 true를 반환하려고 할 때 LEN (NULL) = 0의 역 비교에는 작동하지 않습니다. .
— Zach Johnson

4
Select              
Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

또한 첫 번째 답변 (5 년 후)에 둘을 사용 NULLIF()하고 company.OfferTextnull 인 경우 빈 문자열로 병합합니다 . 그러나 두 번째 NULLIF()호출은 그 값이 빈 문자열 인 것처럼 어쨌든 빈 문자열로 다시 통합되는 것처럼 목적이 없습니다.
— Joel Coehoorn

4

COALESCE와 NULLIF의이 간단한 조합은 다음과 같은 트릭을 수행해야합니다.

SELECT             
  Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text
...

참고 : 두 값이 모두 NULL 인 경우 명령문이 NULL 대신 빈 문자열을 리턴하도록하려면 마지막 COALESCE 인수로 다른 빈 문자열을 추가하십시오.


4

나는 이것이 오래된 스레드라는 것을 알고 있지만 위의 이전 게시물 중 하나를 보았지만 정확하지 않습니다.

당신이 사용하는 경우 LEN을 (...) 필드가 있는지 여부를 확인하기 위해 NULL 또는 빈 다음과 같이 사용합니다 다음 :

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...

3

여기에 해결책이 있지만 그것이 최선인지는 모르겠습니다 ....

Select              
Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text,         
from tbl_directorylisting listing  
 Inner Join tbl_companymaster company            
  On listing.company_id= company.company_id

3
SELECT              
    COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text,         
FROM 
    tbl_directorylisting listing  
    INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id

3

이 구문 :

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

Microsoft SQL Server 2008 (SP3)에서 근무했습니다.


2

SQL 결과에 Empty또는 Null값이 있는 레코드를 방지하려면

우리는 단순히 추가 할 수 있습니다 ..... WHERE Column_name != '' or 'null'


이것은 첫 번째 호출 포트이지만 예를 들어 테이블의 여러 열에서 연결하는 것과 같은 작업을 수행하는 경우 해당 열의 빈
— 칸만


0

[Column_name]> ''는 Null 및 빈 문자열을 제외합니다. 작은 따옴표 사이에는 공백이 있습니다.


0

이것은 또한 공간을 수용합니다.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.