단일 테스트로 null / 빈 / 공백 값을 확인하는 방법은 무엇입니까?


88

하나의 테스트 만 사용하여 값이없는 열 (null, 비어 있음 또는 모든 공백)을 반환하는 SELECT 문을 작성하고 싶습니다.

나는 이것이 효과가 있다고 생각했다.

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

그러나 이것은 NULL 값에 대해서는 작동하지 않습니다.

물론 추가 할 수 있습니다

OR column_name IS NULL

작동하지만 단일 테스트를 사용하는 방법을 원합니다.



여러 테스트를하는 것이 바람직하지 않습니까? 즉 더 세분화 = 데이터 수정 방법에 대해 사용자에게 더 나은 피드백을 제공합니다.
onedaywhen

@onedaywhen : 일반적으로 더 세분화하는 것이 더 나을 수 있지만 기존 코드 기반으로 작업하고 있으며 기존 코드 구조를 가능한 한 가깝게 모방하고 싶습니다. 현재 코드는 테스트를 한 번만 수행하므로 테스트가 하나 뿐인 솔루션을 찾고있었습니다.
John Gordon

답변:


99

기능적으로 사용할 수 있어야합니다.

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

문제는 COLUMN_NAME의 색인이 사용되지 않는다는 것입니다. 선택적 조건 인 경우 TRIM (column_name)에 함수 기반 인덱스가 있어야합니다.


32
T-SQL 사용자를위한 참고 사항 : TRIM이 없으며 LTRIM 또는 RTRIM이 필요합니다.
demoncodemonkey

11
SQL Server 2017 부터 TRIM 기능이 있습니다. 출처
bvwidt

1
@ EhMann365이 질문은 Sql Server가 아니라 Oracle에 관한 것입니다.
MH

11
RTRIM (LTRIM (column_name))-Microsft SQL 사용자 용.
DxTx

4
Sql Server에서 TRIM (column_name)은 NULL이 아닌 빈 문자열 ''을 반환합니다. 다른 답변은 빈 문자열과 NULL을 모두 지원합니다
Michael Freidgeim

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') column_name이 NULL이면 ''를 반환하고 그렇지 않으면 column_name을 반환합니다.

최신 정보

Oracle에서는을 사용 NVL하여 동일한 결과를 얻을 수 있습니다 .

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
실제로 이것은 Oracle에서 여전히 작동하지 않습니다. Oracle은 빈 문자열을 NULL로 취급하므로 null 값과 비교하기 때문에 "not like ''"절이 없을 수 있습니다.
Harrison

NOT LIKE ''대신 LIKE ''를 원하지 않습니까?
John Gordon

예, 죄송합니다. 원래 질문을 가치있는 모든 것을 원한다고 잘못 읽었습니다. 그러나 tanging이 지적했듯이 이것이 Oracle에서 작동하지 않는 것 같습니다.
GendoIkari 2010

Oracle을 사용하고 있기 때문에 WHERE TRIM (col) IS NULL을 사용할 수 있으며 null, 공백 및 공백 값을 처리합니다.
John Gordon

분명히 첫 번째 부분에는 괄호가 누락되어 있어야합니다.WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

14

NULLIF 함수는 공백 만있는 모든 열 값을 NULL 값으로 변환합니다. T-SQL 및 SQL Server 2008 이상에서 작동합니다.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
좋은 대답에는 코드에 대한 설명과이 방법으로 작성된 이유가 포함됩니다. 나는 당신의 대답을 업데이트하는 것이 좋습니다 :-)
Qirel

1
이것의 요점은 무엇입니까? [column_name] LIKE ''로 설정하는 것이 더 효율적일 것입니다. ''
SILENT

여러 공백을 지원하려면 TRIM이 필요합니다.
Michael Freidgeim

1
SQL Server 2017에서 테스트하면 TRIM이없는 여러 공백에 대해 작동합니다. 문서에 따르면 NULLIF는 두 표현식이 같고 공백 문자열이 일반적으로 빈 문자열과 같지 않은 경우에만 NULL을 반환해야하므로 이해가되지 않습니다. (탭, 줄 바꿈 또는 기타 공백 문자가 아닌 공백 만 테스트했습니다.)
Jovie

1
@Jovie SQL Server는 때때로 후행 공백을 무시합니다. 읽기 : stackoverflow.com/questions/17876478/…
Brian MacKay

7

null or Empty컬럼의 값을 확인하는 동안 여러 데이터베이스에서 지원 문제가 있음을 발견했습니다.

모든 데이터베이스는 지원하지 않습니다 TRIM 방법.

아래는 다른 데이터베이스에서 지원하는 방법을 이해하기위한 매트릭스입니다.

SQL의 TRIM 함수는 문자열에서 지정된 접두사 또는 접미사를 제거하는 데 사용됩니다. 제거되는 가장 일반적인 패턴은 공백입니다. 이 함수는 다른 데이터베이스에서 다르게 호출됩니다.

  • MySQL : TRIM(), RTRIM(), LTRIM()
  • 신탁: RTRIM(), LTRIM()
  • SQL 서버 : TRIM(), RTRIM(), LTRIM()

빈 / Null / 공백 확인 방법 :-

아래는 서로 다른 데이터베이스에 따라 두 가지 다른 방법입니다.

이러한 트림 함수의 구문은 다음과 같습니다.

  1. Trim을 사용하여 확인

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. LTRIM 및 RTRIM을 사용하여 확인-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

위의 두 가지 방법은 데이터베이스 지원에 따라 동일한 결과를 제공합니다. 비어 있으면 FirstNamefrom UserDetails테이블을 반환합니다.LastName

이것이 다른 사람들에게도 도움이되기를 바랍니다. :)


WITH t as (select ''c union all select ''c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; SQL 서버에서 3 개의 레코드를 반환하지 않았습니다
Waqar

5
L과 RTRIM이 모두 필요한 이유는 무엇입니까? 열이 비어 있는지 확인하는 데 함수 중 하나만으로 충분하지 않습니까?
SILENT

4

이 phpMyAdmin 쿼리는 null이 아니거나 비어 있지 않거나 공백 만있는 행을 반환합니다.

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

null / 빈 / 단지 공백 인 행을 선택하려면 NOT을 제거하십시오.


2

아래 쿼리를 사용하면 작동합니다.

SELECT column_name FROM table_name where isnull(column_name,'') <> ''

0

IsNotNullOrEmptyOrWhiteSpaceT-SQL에서 사용하는 것은 다음과 같습니다.

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

0

특정 필드가 비어있는 레코드를 찾기 위해 Oracle에서 쿼리를 실행하라는 모든 개인 제안 ((null) 또는 다른 필드 만 빈 줄만 포함)은 작동하지 않았습니다. 나는 모든 제안 코드를 시도했다. 온라인에서 계속 검색 할 것 같아요.

*****최신 정보*****

나는 이것을 시도했고 효과가 있었지만 <1이면 작동하지 않는 이유가 확실하지 않지만 어떤 이유로 <2가 작동하고 필드가 비어있는 레코드 만 반환했습니다.

[tableName]에서 [columnName]을 선택합니다. 여기서 LENGTH (columnName) <2;

데이터를 변환하는 데 사용 된 스크립트가 공백으로 표시 되더라도 필드에 무언가를 남겼을 것이라고 생각합니다. 어쨌든 <2가 작동하지만 <1이 아닌 이유에 대한 내 추측입니다.

그러나 해당 열 필드에 2 자 미만의 다른 값이있는 경우 다른 솔루션을 찾아야 할 수 있습니다. 다른 캐릭터가 많지 않다면 그들을 골라 낼 수 있습니다.

내 솔루션이 언젠가 다른 사람을 도울 수 있기를 바랍니다.


-3

Oracle에서와 같이 MySQL에서 NVL 함수를 사용할 수 있습니다. IFNULL (columnaName, newValue)을 사용하여이 예제와 같이 원하는 결과를 얻을 수 있습니다.

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

당신이 사용할 수있는

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.