MySQL SELECT yalnızca boş değerler değil


264

Yalnızca NOT NULL değerleri alan bir select deyimi yapmak mümkün müdür?

Şu anda bunu kullanıyorum:

SELECT * FROM table

Ve sonra bir php döngü ile null değerleri filtrelemek zorunda.

Yapmanın bir yolu var mı:

SELECT * (that are NOT NULL) FROM table

?

Şu anda seçtiğimde * val1, val2, val3, null, val4, val5, null, null vb .... olsun ama sonuçta null olmayan değerleri almak istiyorum. Bir döngü ile filtreleme olmadan bu mümkün mü?


2
Bazı sütunların NULL değerleri, diğer sütunların NULL değerleri olmadığı bir satır varsa ne olmak istersiniz?
Mark Byers

Yalnızca null olmayan sütunlardan değerleri almak ve yalnızca null olmayan satırdaki sütun değerlerini döndürmek istiyorum. Şu anda onları filtrelemek için bir döngü kullanıyorum, bunu bir döngü olmadan yapmak mümkün mü?
bryan sammon

1
@bryan - Masa yapınız nedir? Tüm sütunlar aynı veri tipine sahip mi?
Martin Smith

1
@bryan - Peki ideal sonuç kümeniz nasıl görünürdü? Tüm null olmayan değerleri içeren bir sütun sonuç kümesi? Sorunuzu örnek verilerle ve istenen sonuçlarla düzenlemezseniz yardımcı olur ...
Martin Smith

2
@bryan - Görünüşe göre tablonuzun sütunlar arasında yinelenen gruplar olabilir mi? (Böyle bir açıklama ve önerilen alternatif yapı için Wiki makalesine bakın en.wikipedia.org/wiki/First_normal_form )
Martin Smith

Yanıtlar:


453

Kullanmalısınız IS NOT NULL. (Karşılaştırma operatörleri =ve <>hem vermek UNKNOWNile NULLifade her iki tarafında).

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Tam olarak söylemek gerekirse, MySQL'de null güvenli eşitlik operatörünü de reddedebileceğinizi söyleyeceğim, ancak bu standart SQL değil.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Yorumları yansıtacak şekilde düzenlendi. Tablonuz ilk normal formda olmayabilir, bu durumda yapıyı değiştirmek görevinizi kolaylaştırabilir. Yine de bunu yapmanın birkaç yolu ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

Yukarıdakilerin dezavantajı, tabloyu her sütun için bir defadan fazla taramasıdır. Bu muhtemelen aşağıdaki tarafından önlenebilir ama MySQL bunu test etmedim.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
Çok teşekkürler ..
Yardımcı

Son yaklaşımda, işlevi CASEdeğil ifadeyi kullandınız CASE. Bu yüzden olmamalı END CASEyerine END de SELECT CASE ...parçası?
Istiaque Ahmed

Uzman olmayan insanlar için son çözümü açıklayabilir misiniz? Does idx rom ilk SELECTgelen idxikinci SELECT? Açıklama neyi CASEbaşarmaya çalışıyor? İkincisi SELECTaslında ne yapıyor? Ve bir iç birleşim yapıyorsunuz, çapraz birleşim değil, değil mi?
Istiaque Ahmed

Bunun soruyu cevapladığını sanmıyorum. OP'nin (belirli bir varsayım) satır seçmek istediğini, ancak tüm sütunları boş olan bu sonuçtan hariç tuttuğunu düşündü - bu cevap, hangi sütunların boş olmasına izin verilmediğini (tamamen farklı bir sorun) belirtmenizi gerektirir veya birçok sütunu olan tablolar için uygun olmayan tüm sütunları belirtin
csey

(örneğin, hatlarında bir şey SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

Belirli bir sütunda NULL değeri içeren satırlara filtre uygulayabilirsiniz:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Herhangi bir sütunda null içeren satırları filtrelemek istiyorsanız bunu deneyin:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Güncelleme: Yorumlarınıza dayanarak, belki de bunu istiyorsunuz?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

Ve bunu yapman gerekiyorsa, muhtemelen veritabanı tasarımını değiştirmelisin.


Yeterince iyi açıkladığımdan emin değilim, ama biraz daha iyi deneyeceğim. Şu anda seçtiğimde * val1, val2, val3, null, val4, val5, null, null vb .... olsun ama sonuçta null olmayan değerleri almak istiyorum. Bir döngü ile filtreleme olmadan bu mümkün mü?
bryan sammon

@bryan - Hangi sütunların *geri döndüğünü açıklayabilir misiniz ? Yukarıdaki yorumunuzda bunların hepsinin tek bir sütun olup olmadığı açıkça görülmediğinden, sorunuzda biraz örnek veriler sağlayın.
Martin Smith

Şu anda, * satırdaki tüm değerlerimi döndürüyor. yani val1, val2, val3, null, val4, val5, null, null. Ancak yalnızca null olmayan sütun değerlerini döndürmek istiyorum. Şu anda sonucu döndürdükten sonra değerleri filtrelemek için bir döngü ile yapıyorum.
bryan sammon

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Bu yaklaşımın tek dezavantajı, sadece 5 sütunu karşılaştırabilmenizdir, bundan sonra sonuç her zaman yanlış olur, bu yüzden sadece olabilecek alanları karşılaştırırım NULL.


8

Bu çözümü buldum:

Bu sorgu her sütun için son değil null değerini seçin.

Misal


Bir tablonuz varsa:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

olsun:

title|body
t3   |b2

Sorgu


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

Umarım yardımcı olurum.


GROUP_CONCAT (body) AS body
Ravindra Singh

2

\!Kabuktan NULL değerleri grep için MySQL içindeki komutu kullanın :

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

.my.cnfVeritabanınızın / kullanıcı adınızın / şifrenizin belirtildiği uygun bir yerde en iyi şekilde çalışır . Bu şekilde ve selectile çevrelemeniz yeterlidir .\! mysql e| grep -v NULL


1

Benim için çalışan aşağıdaki sorgu

'NULL' sütununun varsayılan değerini ayarladığımda

select * from table where column IS NOT NULL

ve varsayılan değeri ayarladığımda

select * from table where column <>''

0

Evet NOT NULL, sorgunuzda aşağıdaki gibi kullanın .

SELECT * 
FROM table
WHERE col IS NOT NULL;

0

MYSQL BİRLEŞME VE SEÇME, SEÇME, SİLME VE LOJİK OPERATÖR GİBİ YA DA DEĞİL DEĞİLDİR

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

2
Bu hangisinin boş olduğunu seçmez. soru değil null değerleri seçmek içindir
krishna
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.