Tek bir testle boş / boş / boşluk değerleri nasıl kontrol edilir?


88

Değersiz sütunları (null, boş veya tüm boşluklar) döndürmek için yalnızca bir test kullanan bir SELECT ifadesi yazmak istiyorum.

Bunun işe yarayacağını düşündüm:

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

Ancak bu, NULL değerler için çalışmaz.

Tabiki ekleyebilirim

OR column_name IS NULL

ve işe yarayacak, ancak tek bir test kullanan bir yol istiyorum.



Birden fazla test yaptırmak istenmiyor mu? yani, daha fazla ayrıntı = verilerin nasıl düzeltileceği konusunda kullanıcılara daha iyi geribildirim.
onedaywhen

@onedaywhen: Genelde daha fazla ayrıntı düzeyine sahip olmak daha iyi olabilir, ancak mevcut bir kod tabanıyla çalışıyorum ve mevcut kod yapısını olabildiğince yakından taklit etmek istiyorum. Mevcut kod sadece bir test yapıyor, bu yüzden sadece bir testi olan bir çözüm arıyordum.
John Gordon

Yanıtlar:


101

İşlevsel olarak, kullanabilmelisiniz

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Buradaki sorun, COLUMN_NAME üzerindeki bir dizinin kullanılmamasıdır. Bu seçici bir koşulsa, TRIM (sütun_adı) üzerinde işlev tabanlı bir dizine sahip olmanız gerekir.


32
T-SQL kullanıcıları için not: TRIM yoktur, LTRIM veya RTRIM'e ihtiyacınız olacaktır.
demoncodemonkey

11
SQL Server 2017'den beri bir TRIM işlevi vardır. Kaynak
bvwidt

1
@ EhMann365 bu soru Sql Server değil Oracle ile ilgili.
MH

11
RTRIM (LTRIM (sütun_adı)) - Microsft SQL Kullanıcıları için.
DxTx

4
Sql Sunucusunda TRIM (sütun_adı), NULL değil, boş dize '' döndürür. Diğer yanıtlar hem boş dizeyi hem de
NULL'u

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

ISNULL(column_name, '') sütun_adı NULL ise '' döndürür, aksi takdirde sütun_adı döndürür.

GÜNCELLEME

Oracle'da NVLaynı sonuçları elde etmek için kullanabilirsiniz .

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

3
aslında bu Oracle'da hala çalışmıyor, Oracle boş dizeleri NULL olarak değerlendiriyor, bu nedenle boş bir değerle karşılaştırdığı için "benzemeyen" cümlesine sahip olmayabilirsiniz
Harrison

GİBİ DEĞİL '' yerine GİBİ '' istemez miydim?
John Gordon

Evet, üzgünüm, orijinal soruyu, değeri olan her şeyi istemek olarak yanlış okuyun. Ancak tanging'in de işaret ettiği gibi, bu Oracle'da işe yarayacak gibi görünmüyor.
GendoIkari

Oracle kullandığım için, WHERE TRIM (col) IS NULL'u kullanabilirim ve bu, null, blank ve whitespace değerlerini dikkate alacak gibi görünüyor.
John Gordon

Açıkçası, ilk bölümü bir parantezi eksik, bu olmalıdır:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

15

NULLIF işlevi, yalnızca beyaz boşluk içeren herhangi bir sütun değerini NULL değerine dönüştürür. T-SQL ve SQL Server 2008 ve üzeri için çalışır.

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

1
İyi bir cevap, kodun bir açıklamasını ve neden bu şekilde yazıldığını içerecektir. Cevabınızı güncellemenizi tavsiye ederim :-)
Qirel

1
Bunun anlamı ne? Yalnızca [sütun_adı] LIKE '' olarak ayarlamak daha verimli olacaktır
SILENT

Birden fazla beyaz alanı desteklemek için
TRIM'e

1
SQL Server 2017'de test edildiğinde bu, TRIM olmadan birden çok beyaz alan için çalışır. Bana mantıklı gelmiyor, çünkü belgelere göre NULLIF yalnızca iki ifade eşitse ve boşluk dizesi genellikle boş bir dizgeye eşit değilse NULL döndürmelidir. (Yalnızca boşlukları test ettim, sekmeler, satırsonları veya diğer boşluk karakterleri için test
etmedim

1
@Jovie SQL Server bazen sondaki boşluğu yok sayar, okuyun: stackoverflow.com/questions/17876478/…
Brian MacKay

7

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

Her Veritabanı desteklemiyor TRIM yöntem.

Aşağıda, farklı veritabanları tarafından desteklenen yöntemleri anlamak için matris 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: TRIM(), RTRIM(), LTRIM()

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

Aşağıda farklı Veritabanlarına göre iki farklı yol bulunmaktadır:

Bu kırpma işlevlerinin sözdizimi şunlardır:

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

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

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

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

Her iki yolun üstünde aynı sonucu sağlar, sadece DataBase desteğinize göre kullanın. Bu sadece döner FirstNamegelen UserDetailsboş bir sahipse masayaLastName

Bunun başkalarına da yardımcı olacağını umuyoruz :)


T olarak ('' c birleşim tümünü seç '' seçeneğini seçin c birleşim hepsini BOŞ seçin) SEÇ * LTRIM (RTRIM (c)) NULL OLDUĞUNDAN; SQL sunucusunda 3 kayıt döndürmedi
Waqar

5
Neden hem L hem de RTRIM'e ihtiyaç duyulur? Sütunun boş olup olmadığını kontrol etmek için işlevlerden sadece biri yeterli olmaz mı?
SILENT

4

Bu phpMyAdmin sorgusu, boş veya boş OLMAYAN veya sadece boşluk olmayan satırları döndürüyor:

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

null / boş / sadece beyaz boşluklar olan satırları seçmek istiyorsanız sadece NOT'u kaldırın.


2

Aşağıdaki sorguyu kullanın ve işe yarıyor

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

0

Ne için kullanmak IsNotNullOrEmptyOrWhiteSpaceT-SQL geçerli:

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

0

Her bir kişinin, belirli alanı boş olan kayıtları bulmak için Oracle'da bir sorgu çalıştırma önerisi (bu, (boş) veya başka herhangi bir alan, yalnızca boş bir satır dahil değildir) işe yaramadı. Önerilen her kodu denedim. Sanırım çevrimiçi aramaya devam edeceğim.

*****GÜNCELLEME*****

Bunu denedim ve işe yaradı, <1, ancak bazı nedenlerden dolayı <2 çalıştıysa ve yalnızca alanı boş olan kayıtları döndürse neden çalışmayacağından emin değilim

[tableName] 'den [columnName] seçin burada LENGTH (columnName) <2;

Verileri dönüştürmek için kullanılan komut dosyasının boş görünmesine rağmen alanda bir şey bıraktığını tahmin ediyorum, bu benim tahminim <2'nin neden işe yarayıp <1

Bununla birlikte, bu sütun alanında iki karakterden daha az olan başka değerler varsa, o zaman başka bir çözüm bulmanız gerekebilir. Çok fazla başka karakter yoksa, onları ayırabilirsiniz.

Umarım çözümüm bir gün orada başka birine yardımcı olur.


-3

Oracle'da olduğu gibi, MySQL'de NVL işlevini kullanabilirsiniz, bu örnekte olduğu gibi istediğiniz sonucu elde etmek için IFNULL (columnaName, newValue) kullanabilirsiniz.

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

-4

kullanabilirsiniz

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
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.