Sütunun boş olmadığı yerde MySQL seçin


182

MySQL'de yalnızca bir şeyin olduğu yerlerde sütun seçebilir miyim?

Örneğin, aşağıdaki sorgu var:

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

Sadece telefonun 813 ile başladığı ve telefon2'nin içinde bir şey olduğu satırları seçmeye çalışıyorum.


2
Ne demek istediğini " phone2içinde bir şey var " diye açıklayabilir misin ? İnsanlar Şunu olmadığına dair tahminler alıyor phone2IS DEĞİL NULL, boşluk, vb münhasıran, boş değil değil
Pilcrow

1
"bir şey" varsa, açıkçası boş değildir.
mike

Yanıtlar:


277

Değerini phone2boş dizeyle karşılaştır:

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

Not NULLolarak yorumlanır değeri false.


5
Tek tırnak, çift tırnak değil.
OMG Ponies

2
phone2<>""SQL sözdizimi denetleyicisini geçemez.
OMG Ponies

5
@OMG Ponies: Ama mysql'de çalışıyor.
Önemli

7
@ivan: Bana haberler, bunun için üzgünüm.
OMG Ponies

<> ile aynıdır =. basitti. ama bilmiyordum :)
MFarooqi

48

Alan BOŞ kullanımı olup olmadığını kontrol etmek IS NULL, IS NOT NULLoperatörler.

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


10
OP yalnızca phone2 alanında bir şey olan satırları soruyor. IS NOT NULL, kelimenin tam anlamıyla NULL olarak ayarlanmamış her şeyi, hatta boş "" dizesini döndürür. ! = '' veya Ivan'ın kabul edilen cevapta söylediği gibi <> '' boş dizeler veya NULL değerler döndürmez. Başka bir deyişle IS NOT NULL,! = '' İfadesinin bir alt kümesidir, ancak eşdeğer değildir.
Hiçbiri

34

NULLDize değerlerini kontrol edin ve boşaltın:

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

NB Bence COALESCE () SQL standardı (-ish), oysa ISNULL () değildir.


1
Trim işlevini kullanmanıza gerek yoktur, çünkü MySQL'de herhangi bir sayıda boşluğun bir dizesi herhangi bir sayıda boşluğun başka bir dizesine eşittir, bunun üzerine oldukça ayrıntılı bir şekilde yazdım stackoverflow.com/a/ 42723975/728236
Brian Leishman

26

Kullandığım bir cevap benim için zaten çok iyi çalışıyor, burada görmedim (bu soru çok eski, o zaman işe yaramamış olabilir) aslında

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

> ''Değerin null olup olmadığını ve değerin yalnızca boşluk veya boşluk olmadığını kontrol edecek kısma dikkat edin.

Temel olarak, alanın içinde boşluk dışında bir şey varsa veya NULLbu doğrudur. Ayrıca süper kısa, bu yüzden yazmak kolaydır ve COALESCE()ve IFNULL()işlevleri üzerinde başka bir artı , bu dizin dostu olmasıdır, çünkü bir alandaki bir işlevin çıktısını herhangi bir şeyle karşılaştırmazsınız.

Test senaryoları:

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

GÜNCELLEME Beklemediğim bir uyarı var, ancak sıfır veya altındaki sayısal değerler boş bir dizeden daha büyük değil , bu nedenle sıfır veya negatif olabilecek sayılarla uğraşıyorsanız, bunu YAPMAYIN , beni çok yakın zamanda ısırdı ve hata ayıklamak çok zordu :(

Dizeleri (char, varchar, text, vb.) Kullanıyorsanız, bu mükemmel olacak, sadece sayılara dikkat edin.


17

Telefon2 alanında, istenmeyen veri girişinden boşluklar varsa, bu kayıtları IFNULL ve TRIM işlevleriyle yoksayabilirsiniz:

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

Trim işlevini kullanmanıza gerek yoktur, çünkü MySQL'de herhangi bir sayıda boşluğun bir dizesi, herhangi bir sayıda boşluğun başka bir dizesine eşittir, bunun üzerine oldukça ayrıntılı olarak yazdım stackoverflow.com/a/ 42723975/728236
Brian Leishman

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

6
Bir arasında bir fark olduğuna dikkat edin NULLdeğeri ve boş bir dize olan bir değer. Boş bir dizeye karşı kontrol etmek istiyorsanız , diğer cevapların önerdiği şekilde kullanın . ''column <> ''
Dzhuneyt

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

Varsayılan değerinizin ne olduğuna bağlı olarak biraz bükülmeye ihtiyaç duyabilir. Null doldurmaya izin verdiyseniz, bunun yerine "Not NULL" yapabilirsiniz, ki bu daha iyidir.


Seni işaretlemek değil ama: 1) NOT()MySQL 2 hiçbir işlevi yoktur ) phone2=""herhangi bir SQL sözdizimi denetleyicisi geçmiş yapmaz.
OMG Ponies

1
Heh, özür dilerim. Bir çok farklı SQL sunucusu kullanıyorum.
Satanicpuppy

2

CASE'i bazı char veya String olarak boş değer ayarlamak için kullanabiliriz. Varsayılan dize olarak NA kullanıyorum.

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

2

Başka bir alternatif, özellikle CHAR_LENGTHsütun değerlerine bakmaktır . (karıştırılmamalıdır LENGTH)

Bu tür bir değerine sahip bir tamsayı sütunu olması halinde, sütun değerleri Falsey olabilir yanlış pozitif önlemek karakterlik 0'dan büyük olan bir kriterleri kullanarak, 0ya da NULL. Farklı veri türlerinde daha tutarlı davranma.

Bu, en az 1 karakter uzunluğunda veya başka türlü boş olmayan herhangi bir değerle sonuçlanır.

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

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

Tablo Verileri

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) > 0Sonuçlar (aynı)

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

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

Alternatifler

phone2 <> ''Sonuçlar (farklı)

users
813-123-4567       | 1

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

phone2 > ''Sonuçlar (farklı)

users
813-123-4567       | 1

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

COALESCE(phone2, '') <> ''Sonuçlar (aynı)
Not: sonuçlar phone2 IS NOT NULL AND phone2 <> ''beklenenden farklı

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

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

phone2 IS NOT NULL AND phone2 <> ''Sonuçlar (farklı)

users
813-123-4567       | 1

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

2

Şaşırtıcı bir şekilde (daha önce kimsenin bahsetmediği gibi) aşağıdaki durumun işi yaptığını buldu:

WHERE ORD(field_to_check) > 0 

boş ve boş değerleri hariç tutmamız gerektiğinde. Yaklaşımın olumsuz taraflarının farkında olan var mı?


ive sözdizimi doğru almak için saatlerce çalışıyorum ve bu sadece teşekkürler her şeyi çözdü!
demo7up

1

kullanın:

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

1
Bazen IS NOT NULLsadece boş değerlere ( '') sahip sütunlara uygulanmadığını fark ettim . Nedenini bilmiyorum, ama sadece belirtmek istedim. t.phone2 <> ''Boş dize sütunlarını kontrol ederken kullanmak daha akıllıca olur .
Dzhuneyt

0

bunu başarmak için operatör joker karakteri gibi kullanabilirsiniz:

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

bu şekilde, bir numara öneki olan tüm telefon2'yi alabilirsiniz.


0

Benim durumumda bir varchar sütunu vardı, hem yöntemleri işe yaramadıIS NOT NULL ve != '' işe yaramadı , ancak aşağıdakiler benim için çalıştı. Sadece buraya koyuyorum.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
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.