빈 값 또는 null 값을 확인하는 가장 좋은 방법
Postgres SQL 문에서 값이 null인지 빈 문자열인지 확인하는 가장 좋은 방법은 무엇입니까?
값은 긴 표현식일 수 있으므로 한 번만 체크 표시하는 것이 좋습니다.
현재 사용 중:
coalesce( trim(stringexpression),'')=''
그런데 좀 못생겼어요.
stringexpression아마도요.char(n) 하는열또식는함음이 된 열 식char(n)후행 공백이 있는 열.
가장 좋은 방법은 무엇입니까?
그표은라는 stringexpression = ''산출량:
TRUE…을 위해서''(또는 데이터 형식의 공백으로만 구성된 문자열의 경우)char(n))
NULL…을 위해서NULL
FALSE 외의 것은
다음을 확인하려면:stringexpression "이(가) NULL이거나 비어 있습니다."
(stringexpression = '') IS NOT FALSE
또는 역방향 접근법(읽는 것이 더 쉬울 수 있음):
(stringexpression <> '') IS NOT TRUE
다음을 포함한 모든 문자 유형에 대해 작동합니다.char(n)비교 연산자에 대한 설명서입니다.
또는 값비싼 노이즈를 제외한 원래 표현을 사용합니다.char(n)(아래 참조) 또는 다른 문자 형식의 경우 올바르지 않습니다. 공백으로만 구성된 문자열은 빈 문자열로 전달됩니다.
coalesce(stringexpression, '') = ''
하지만 맨 위에 있는 표현이 더 빠릅니다.
그 반대를 주장하는 것은 훨씬 더 간단합니다:stringexpression "는 NULL도 비어 있지도 않습니다."
stringexpression <> ''
정보
이것은 데이터 유형에 관한 것입니다.char(n) 약어:character(n). (char/character의 줄임말char(1)/character(1).) Postgres에서는 사용이 금지됩니다.
의 상황에서 대분의경우부▁in
text또는character varying대신 사용해야 합니다.
▁do▁▁not십마를 혼동하지 마세요.char(n)기타, 유용한 문자 유형 , 또는 (이중 기호 사용).
char(n)빈 문자열은 공백으로만 구성된 다른 문자열과 다르지 않습니다.이 모든 것들은 접혀진 n개의 공간에char(n)형식의 정의에 따라.논리적으로 위의 표현은 다음과 같습니다.char(n)마찬가지로 - (다른 문자 유형에는 적용되지 않는) 다음과 같습니다.
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
데모
은 " 문열은다캐스때될공동다일니합문자백과열팅빈로음"로 될 때 .char(n):
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
결과:
eq1 | eq2 | eq3
----+-----+----
t | t | t
" 또는 빈 문자열을 "null 또는 빈 로 합니다.char(n):
SELECT stringexpression
, stringexpression = '' AS base_test
, (stringexpression = '') IS NOT FALSE AS test1
, (stringexpression <> '') IS NOT TRUE AS test2
, coalesce(stringexpression, '') = '' AS coalesce1
, coalesce(stringexpression, ' ') = ' ' AS coalesce2
, coalesce(stringexpression, '') = ' ' AS coalesce3
FROM (
VALUES
('foo'::char(5))
, ('')
, (' ') -- not different from '' in char(n)
, (NULL)
) sub(stringexpression);
결과:
문자열 표현식 | base_test | test1 | test2 | coales1 | coales2 | coales3------------------+-----------+-------+-------+-----------+-----------+-----------foo | f | f | f | f | f | ft | t | t | t | t | tt | t | t | t | t | tnull | null | t | t | t | t | t | t
" 또는 빈 문자열을 "null 또는 빈 로 합니다.text:
SELECT stringexpression
, stringexpression = '' AS base_test
, (stringexpression = '') IS NOT FALSE AS test1
, (stringexpression <> '') IS NOT TRUE AS test2
, coalesce(stringexpression, '') = '' AS coalesce1
, coalesce(stringexpression, ' ') = ' ' AS coalesce2
, coalesce(stringexpression, '') = ' ' AS coalesce3
FROM (
VALUES
('foo'::text)
, ('')
, (' ') -- different from '' in a sane character types
, (NULL)
) sub(stringexpression);
결과:
문자열 표현식 | base_test | test1 | test2 | coales1 | coales2 | coales3------------------+-----------+-------+-------+-----------+-----------+-----------foo | f | f | f | f | f | ft | t | t | t | f | ff | f | f | f | f | fnull | null | t | t | t | t | f
db<>여기로 이동
올드 sqlifiddle
관련:
null 및 비어 있는지 확인하는 방법
coalesce(string, '') = ''
null, 빈 공간 및 공백 확인(문자열 자르기)
coalesce(TRIM(string), '') = ''
문자열의 길이를 확인하는 것도 작동하고 압축됩니다.
where length(stringexpression) > 0;
열에 귀무 가설이 많은 경우에는 많은 답이 가장 짧은 방법이지 반드시 가장 좋은 방법은 아닙니다.검사를 세분화하면 최적화 도구가 다른 조건에서 작업을 수행할 필요가 없으므로 검사를 더 빨리 평가할 수 있습니다.
(stringexpression IS NOT NULL AND trim(stringexpression) != '')
첫 번째 조건이 false이므로 문자열 비교를 평가할 필요가 없습니다.
다른 방법은
nullif(trim(stringExpression),'') is not null
후행 공백이 비어 있으면 더 나은 해결책이 없을 수도 있습니다. COALESCE당신과 같은 문제들을 위한 것입니다.
을 본 은 내가사람사것본을것은는용하입니다.stringexpression > ''이것은 가장 빠른 것은 아닐 수도 있지만, 우연히 가장 짧은 것 중 하나입니다.
MS SQL과 Postgre에서 시도했습니다.SQL.
이와 비슷한 경우를 겪었습니다. 제 표의 정의는 다음과 같습니다.
id(bigint)|name (character varying)|results(character varying)
1 | "Peters"| [{"jk1":"jv1"},{"jk1":"jv2"}]
2 | "Russel"| null
null 또는 빈 결과 열을 필터링하려면 다음과 같이 해야 합니다.
SELECT * FROM tablename where results NOT IN ('null','{}');
결과에서 null이 아닌 모든 행이 반환되었습니다.
결과에 null이 아닌 동일한 모든 행을 반환하도록 이 쿼리를 수정하는 방법을 잘 모르겠습니다.
SELECT * FROM tablename where results is not null;
음, 내가 뭘 놓쳤나요, 캐스팅? 어떤 입력이라도요?
'데이터를 표시하지 않음(공백 또는 단일 공백 문자) 또는 null'에 대한 해결책을 찾는 이 게시물을 찾았습니다.이 경우에는 이러한 값이 입력된 사용자 레코드만 표시합니다.저는 이 응답이 같은 것을 찾는 다른 사람에게 도움이 되기를 바랍니다.위의 대답은 제 경우에는 통하지 않았습니다.
우리 앱은 포스트그레스로 레일을 실행하고 있습니다.레일이 어떻게 쿼리를 구성하는지 살펴봅니다..where.not(company_website: [nil, ''])잘 작동하는 앱에서 콘솔에서 결과 sql 문을 볼 수 있습니다.
WHERE NOT ((contacts.company_website = '' OR contacts.company_website IS NULL))
저는 이 부분을 추가했고 그것은 의도한 대로 작동합니다.
저는 yglodt에 의한 답변을 좋아하지만, 정확한 길이를 계산하는 것은 큰 세트와 큰 스트링에 비용이 많이 들 수 있기 때문에 다음과 같이 합니다.
coalesce(trim('a') > '','f')
nullable 필드를 비교하는 기본 방법은 NULLIF(nullablefield, :ParameterValue) ISNULL이고 NULLIF(:ParameterValue, nullablefield) ISNULL입니다. 이는 번거롭지만 일반적으로 사용되며 경우에 따라 병합이 불가능합니다.
NULLIF를 두 번째로 역으로 사용하는 이유는 첫 번째 매개 변수가 null이면 "NULLIF(nullable field, :ParameterValue) IS NULL"이 항상 "true"를 반환하기 때문입니다.
데이터베이스에 많은 수의 레코드가 있는 경우null check다음과 같은 다른 방법으로 null 검사를 사용할 수 있습니다. 1)where columnname is null2)where not exists()3)WHERE (case when columnname is null then true end)
언급URL : https://stackoverflow.com/questions/23766084/best-way-to-check-for-empty-or-null-value
'codememo' 카테고리의 다른 글
| SQL Server에서 제약 조건의 이름을 바꾸시겠습니까? (0) | 2023.05.13 |
|---|---|
| 현재 및 미래의 모든 리포지토리에 Git 사후 커밋 후크 적용 (0) | 2023.05.13 |
| 왜 코어를 써야 하죠?autocolf=git에 참입니까? (0) | 2023.05.13 |
| 배포 파일로 npm 패키지를 게시하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
| Angular2 재료 대화 상자에 문제가 있습니다. @NgModule.entryComponents에 추가했습니까? (0) | 2023.05.13 |