MySQL'de bir sütunun boş veya boş olup olmadığını nasıl kontrol edebilirim?


288

Boş veya boş değerler içeren bir tabloda bir sütun var. Bir tabloda bulunan satırlarda bir sütunun boş veya boş olup olmadığını nasıl kontrol edebilirim?

(e.g. null or '' or '  ' or '      ' and ...)

1
MySQL kodu: select isnull(mycolumn) from mytablemycolumn boşsa 1 döndürür.
Eric Leschinski

2
uzunluk (trim (mycolumn))> 0 ne olacak?
Cyril Jacquart

MSSQL için> KOLON NEREDE <> '' YA DA LEN (KOLON)> 0 YA DA NULLIF (LTRIM (RTRIM (COLUMN)), '') NULL DEĞİL
DxTx 23:18

Yanıtlar:


445

Bu some_col, NULLveya ''(boş dize) olan tüm satırları seçer

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

7
Koşulu WHERE some_col IS NULL OR some_col = ' '(dizeye eklenen bir boşluk) olarak değiştirirseniz hem MySQL hem de Oracle üzerinde çalışır, "onedaywhen" yanıtına bakın. some_col = ''boş dizeler NULL anlamına gelir çünkü Oracle üzerinde çalışmaz.
Johanna

1
@Johanna ama geçiş yaparsanız ' ', SQLite çalışmaz. Yalnızca özdeş / doğrudan dize eşleşmesini işler.
Magne

131

SQL-92 Standardında tanımlandığı gibi, farklı genişlikteki iki dizeyi karşılaştırırken, daha dar değer, daha geniş değerle aynı genişliğe sahip olması için boşluklarla sağa doldurulur. Bu nedenle, tamamen boşluklardan (sıfır boşluklar dahil) oluşan tüm dize değerlerinin eşit olduğu kabul edilir;

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Bu nedenle, bu some_coldeğer kaç boşluk oluşturduğuna bakılmaksızın çalışmalıdır :

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

veya daha özlü bir şekilde:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

6
Yastıklı boşluklardan bahsettiğiniz için teşekkürler. Bunlardan kar elde edebilir ve koşulu WHERE some_col IS NULL OR some_col = ' '(dizeye eklenen bir boşluk) olarak değiştirebilirsiniz, daha sonra hem MySQL hem de Oracle üzerinde çalışır. some_col = ''boş dizeler NULL anlamına gelir ve tüm koşul NULL olur, Oracle üzerinde çalışmaz.
Johanna

Benim ihtiyacım bulmak SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; ve SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;MySQL benim için çalıştı. Umarım faydalı olacaktır.
Dinuka Dayarathna

Aslında '' = ' 'SQLServer'da çalışıyor, ancak SQLite'de değil, anlayabildiğim kadarıyla şimdi test etmekten.
Magne

66

Durumu yazmanın daha kısa bir yolu:

WHERE some_col > ''

Yana null > ''üretir unknown, bu ikisi filtreleyerek etkisine sahiptir nullve boş dizeleri.


2
Bunun tersini almanın, NULL olduğu veya boş bir dizenin olduğu tüm kayıtları almanın bir yolu var mı?
Joshua Pinter

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar

6
Bu bazen doğru olabilir, ancak MySQL 14.14'te çalışmaz.
Gunnar Magnór Magnússon

harika çalışıyor ve aslında MariaDB'de null ve boş alanları nasıl filtreleyebileceğimi anlamanın tek yolu
Neal Davis

1
Bunun tersini bulmak için some_col <> '' kullanıyorum
Chargnn

18

Bir sütunun boş olup olmadığını WHERE col IS NULLveya WHERE col IS NOT NULLörn.

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

Örneğinizde çeşitli beyaz boşluk permütasyonlarına sahipsiniz. Kullanarak beyaz boşluğu şeritleyebilir TRIMve COALESCEbir NULL değerini varsayılan olarak kullanabilirsiniz (COALESCE, ilk boş değerli olmayan değeri, verdiğiniz değerlerden döndürür.

Örneğin

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Bu son sorgu MyColboş veya herhangi bir boşluk uzunluğundaki satırları döndürür .

Bundan kaçınabiliyorsanız, WHERE yan tümcesindeki bir sütunda bir işlevin bulunmaması daha iyi olur, çünkü dizin kullanımını zorlaştırır. Bir sütunun boş olup olmadığını kontrol etmek istiyorsanız, bunu yapmak daha iyi olabilir:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Daha fazla bilgi için bkz. TRIM COALESCE ve IS NULL .

Ayrıca MySQL belgelerindeki boş değerlerle çalışma


2
Gerçek çözümü çok kıvrımlı bir şekilde sunuyorsunuz. İlk önce "mycol null olduğu yerde" sorununa eksik bir çözüm sunuyorsunuz. Daha sonra, bundan kaçınılması gerektiğini söylerken bile, burada yan tümcesinde iki iç içe işlev kullanarak bir çözüm sunarsınız. Ancak o zaman gerçek çözüme ulaşırsınız. Gelecekte önce gerçek çözümünüzü sunun.

İkinci örneğinizdeki )=
işaretten

15

WHERE'siz başka bir yöntem, bunu deneyin ..

Hem Boş hem de NULL değerleri seçer

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

null bir şey varsa bu 1 döndürür, neden böyle?
noobie-php

NULLIF boş alan için alan adını kontrol eder ve boşsa NULL'a dönüştürür. NULLIF, boş bir alanı başarılı bir şekilde NULL olarak değiştirdiyse veya zaten NULL ise, ISNULL 1 (true) değerini döndürür. seçeneğini NULLIF (y)
PodTech.io

9

ya

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

veya

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

Veritabanlarımdaki dağınık alanlardan nefret ediyorum. Sütun boş bir dize veya boş olabilirse, her seferinde seçim yapmadan önce bunu düzeltmeyi tercih ederim, şöyle:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Bu, NULL ile boş arasında bir ayrım yapmanıza gerek olmadığı sürece verileri düzenli tutar.


5

Deneyin

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

veya

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Referans


5

Bu ifade benim için çok daha temiz ve daha okunabilir:

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

Projemdeki null or Emptybir sütunun değerini kontrol ederken , çeşitli Veritabanlarında bazı destek endişeleri olduğunu fark ettim.

Her Veritabanı desteklemez TRIM yöntem.

Aşağıda sadece farklı veritabanları tarafından desteklenen yöntemleri anlama matrisi verilmiştir.

SQL'deki TRIM işlevi, bir dizeden belirtilen öneki veya soneki kaldırmak için kullanılır. Kaldırılan en yaygın desen beyaz boşluklardır. Bu işlev farklı veritabanlarında farklı şekilde adlandırılır:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • SQL Server: RTRIM(), LTRIM()

Boş / Boş Nasıl Kontrol Edilir: -

Aşağıda, farklı Veritabanlarına göre iki farklı yol vardır.

Bu kırpma işlevlerinin sözdizimi:

  1. Kontrol etmek için Trim kullanımı

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Kontrol etmek için LTRIM ve RTRIM kullanımı

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

Her iki yolun da üstünde, aynı sonucu yalnızca DataBase desteğinizi temel alarak kullanın. Boş bir tablo varsa , FirstNameyalnızca UserDetailstablodan dönerLastName

Bunun size yardımcı olacağını umuyoruz :)


3

ORDER BY yaparken NULL değerlerin en son sunulmasını istiyorsanız, şunu deneyin:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

Ayrıca yapabilirsin

SELECT * FROM table WHERE column_name LIKE ''

Ters varlık

SELECT * FROM table WHERE column_name NOT LIKE ''

Görünüşe göre çalışmıyor: select NULL like ''döner NULL- en azından MySQL'de.
Titus

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

Bazen boş olan bir alana kıyasla bir sorunum vardı. Bu yardımcı oldu:col1 != IFNULL(col2,'')
webaholik

1

Boş olup olmadığını kontrol et

$column is null
isnull($column)

Boş olup olmadığını kontrol edin

$column != ""

Ancak, sütun için her zaman NOT NULL ayarlamanız gerekir,
mysql optimizasyonu yalnızca bir IS NULL düzeyi işleyebilir


3
NULLDeğerleri asla kabul etmemek tartışmanın bir başka konusudur. Akıl yürütmenizi sağlamadan bu tavsiyeyi yapmanın uygun olduğunu düşünmüyorum.
Aralık'ta ma56

Ben dahil ettim, sabırlı olun. Artı NULL kullanarak hayatı gerçekten zorlaştırır (tıpkı bu soru gibi).
ajreal

5
Bu korkunç bir öneri. INSERT sırasında değeri bilinmeyen bir sütunda NOT NULL ayarı yalnızca -1ve gibi standart olmayan "null" değerlerin kullanılmasını teşvik etmeye yarar ''.
Dan Bechard

Ekleme sırasında değerin ne olduğundan emin değilseniz, herhangi bir olası optimizasyon yapmakta zorluk çekebilirsiniz
ajreal

0
select * from table where length(RTRIM(LTRIM(column_name))) > 0

1
Ne ikisini de kullanarak yapmakta ne oluyor RTRIMve LTRIMancak TRIM?
Nico Haase

0

Benim durumumda, veri içe aktarma sırasında sütuna boşluk girildi ve boş bir sütun gibi görünse de uzunluğu 1 idi. Bu yüzden önce boş görünümlü sütunun uzunluğunu kontrol ettikten length(column)sonra buna göre arama sorgusu yazabiliriz

SEÇ * TABLO UZUNLUĞUNDA (SÜTUN) = boş sütun için sütun uzunluğu


-1

veri türü dize ve satır boşsa bunu deneyin

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

veri türü int veya sütun 0 ise bunu deneyin

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Yanlış cevap. Bu seçilmeyecek NULL.
Pang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.