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.