MySQL은 열이 비어 있지 않은 곳을 선택하십시오.


182

MySQL에서 무언가 존재하는 열만 선택할 수 있습니까?

예를 들어 다음과 같은 쿼리가 있습니다.

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

phone이 813으로 시작하고 phone2에 무언가가있는 행만 선택하려고합니다.


2
" phone2뭔가가있다 " 는 말의 의미를 명확히 할 수 있습니까 ? 사람들은 당신이 phone2NULL이 아니거나, 공백이 아니며, 공백이 아닌지 등을 추측하고 있습니다 .
pilcrow

1
"무언가"가 존재하면 분명히 null이 아닙니다.
mike

답변:


277

phone2빈 문자열과 값을 비교하십시오 .

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

참고 NULL로 해석됩니다 값을 false.


5
큰 따옴표가 아닌 작은 따옴표.
OMG Ponies

2
phone2<>""SQL 구문 검사기를 지나치지 않습니다.
OMG Ponies

5
@ OMG Ponies : 그러나 그것은 mysql에서 작동합니다. 이것은 중요한 검사기입니다
Ivan Nevostruev 2009

7
@ 이반 : 나에게 뉴스, 그것에 대해 죄송합니다.
OMG Ponies

<>는! =와 같습니다. 간단했다. 그러나 나는 몰랐다 :)
MFarooqi

48

필드가 NULL 사용하는 경우 확인하려면 IS NULL, IS NOT NULL연산자.

MySql 참조 http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
OP는 phone2 필드에 무언가가있는 행만 묻고 있습니다. IS NOT NULL은 문자 그대로 NULL로 설정되지 않은 모든 문자열, 심지어 빈 문자열 ""을 반환합니다. Ivan이 허용 된 답변에서 말한 것처럼! = ''또는 <> ''는 빈 문자열이나 NULL 값을 반환하지 않습니다. 다시 말해서 IS NOT NULL은! = ''의 서브 세트이지만 동등하지 않습니다.
없음

34

NULL문자열 값을 확인 하고 비 웁니다.

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

NB COALESCE ()는 SQL 표준 (-ish)이지만 ISNULL ()은 그렇지 않다고 생각합니다.


1
MySQL에서는 임의의 수의 공백 문자열이 임의의 수의 공백 문자열과 동일하기 때문에 트림 기능을 사용할 필요가 없습니다. 이에 대한 답변으로 아주 자세하게 작성했습니다. stackoverflow.com/a/ 42723975/728236
Brian Leishman

26

내가 사용하고있는 대답은 이미 여기에서 보지 못했던 꽤 잘 작동했습니다 (이 질문은 매우 오래되었으므로 작동하지 않았을 수 있음).

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

> ''값이 null이 아니고 값이 공백이나 공백이 아닌지 확인 하는 부분을 ​​확인하십시오.

기본적으로 필드에 공백 또는 이외의 다른 항목이 NULL있으면 사실입니다. 또한 매우 짧기 때문에 작성하기 쉽고 함수 COALESCE()IFNULL()함수의 또 다른 장점 은 필드의 함수 출력을 다른 것과 비교하지 않기 때문에 인덱스 친화적이라는 것입니다.

테스트 사례 :

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

UPDATE 내가 기대하지 않았다 이것에주의해야하지만, 제로 또는 아래에있는 숫자 값이 없는 빈 문자열보다 큰, 그래서 만약 당신이 다음이 작업을 수행하지 제로 또는 음수가 될 수있는 숫자 나왔습니다 거래 , 그것은 최근에 나를 물었고 디버깅하기가 매우 어려웠습니다.

문자열 (char, varchar, text 등)을 사용하는 경우 숫자에주의하면 완벽하게 괜찮습니다.


17

phone2 필드에 부주의 한 데이터 입력에서 공백이 있으면 IFNULL 및 TRIM 함수를 사용하여 해당 레코드를 무시할 수 있습니다.

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

MySQL의 공백의 수의 문자열, 나는 꽤 상세이에 대한 응답으로 작성한 공간의 수의 다른 문자열과 동일하기 때문에 당신은 트림 기능을 사용할 필요가 없습니다 stackoverflow.com/a/ 42723975/728236
Brian Leishman

7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

6
사이에 차이가 있습니다 NULL값과 빈 문자열 입니다 값. 빈 문자열을 확인 하려면 다른 답변에서 제안한대로 사용 하십시오. ''column <> ''
Dzhuneyt

7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

기본값에 따라 약간의 조정이 필요할 수 있습니다. 널 (Null) 채우기를 허용 한 경우 대신 "NULL이 아님"을 수행 할 수 있습니다.


나는 당신을 표시하지 않지만 : 1) NOT()MySQL 에는 기능 이 없습니다. 2) phone2=""SQL 구문 검사기를 지나치지 않습니다.
OMG Ponies

1
미안 나는 다른 SQL 서버를 많이 사용합니다.
Satanicpuppy

2

빈 값을 일부 문자 또는 문자열로 설정하기 위해 CASE를 사용할 수 있습니다. NA를 기본 문자열로 사용하고 있습니다.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

2

다른 대안은 CHAR_LENGTH열 값을 구체적으로 보는 것 입니다. (와 혼동하지 말 것 LENGTH)

이러한 값을 갖는 정수 컬럼의 경우에서와 같이 열 값 falsey 될 때 가양 피할 문자 길이가 0보다 더 큰 기준을 사용 0하거나NULL . 다양한 데이터 유형에서보다 일관되게 작동합니다.

결과적으로 1 자 이상이거나 비어 있지 않은 값이 발생합니다.

https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

테이블 데이터

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0결과 (동일)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

대안

phone2 <> ''결과 (다른)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''결과 (다른)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''결과 (동일)
참고 : phone2 IS NOT NULL AND phone2 <> ''예상 과 다른 결과

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''결과 (다른)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

2

놀랍게도 (이전에 언급 한 사람은 없었 음) 아래 조건이 작동한다는 것을 발견했습니다.

WHERE ORD(field_to_check) > 0 

빈 값과 빈 값을 모두 제외해야 할 때. 아무도 접근 방식의 단점을 알고 있습니까?


나는 구문을 올바르게 얻기 위해 몇 시간 동안 노력해 왔으며 모든 감사를 해결했습니다!
demo7up

1

사용하다:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

1
때로는 IS NOT NULL빈 값 ( '') 이있는 문자열 전용 열에는 적용되지 않는 것으로 나타났습니다 . 이유를 모르겠지만 지적하고 싶었습니다. t.phone2 <> ''빈 문자열 열을 확인할 때 사용하는 것이 더 현명합니다 .
Dzhuneyt

0

연산자 와일드 카드처럼 사용하여이를 달성 할 수 있습니다.

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

이런 식으로 번호 접두사가있는 모든 phone2를 얻을 수 있습니다.


0

내 경우에는 varchar 열이 있었고 IS NOT NULL&의 두 가지 방법이 모두 != '' 작동하지 않았지만 다음은 저에게 효과적 이었습니다. 그냥 여기에 넣어

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