MySQL का चयन करें जहां कॉलम खाली नहीं है


182

MySQL में, क्या मैं केवल उन कॉलम का चयन कर सकता हूँ जहाँ कुछ मौजूद है?

उदाहरण के लिए, मेरे पास निम्नलिखित प्रश्न हैं:

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

मैं केवल उन पंक्तियों का चयन करने की कोशिश कर रहा हूं जहां फोन 813 से शुरू होता है और फोन 2 में कुछ है।


2
क्या आप इसका मतलब स्पष्ट कर सकते हैं कि " phone2इसमें कुछ है?" लोग अनुमान लगा रहे हैं कि क्या आपका मतलब phone2आईएस नहीं है, खाली नहीं है, विशेष रूप से
व्हॉट्सएप

1
यदि "कुछ" मौजूद है, तो यह स्पष्ट रूप से अशक्त नहीं है।
माइक

जवाबों:


277

phone2खाली स्ट्रिंग के मूल्य की तुलना करें :

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

ध्यान दें कि NULLमान के रूप में व्याख्या की गई है false


5
सिंगल कोट्स, डबल कोट्स नहीं।
OMG पॉनीज़

2
phone2<>""यह किसी भी SQL सिंटैक्स चेकर को अतीत नहीं बनाएगा।
OMG पॉनिस

5
@OMG पॉनीज़: लेकिन यह mysql में काम करता है। यह केवल चेकर बात है वह यह है कि
इवान Nevostruev

7
@ivan: मेरे लिए समाचार, इसके बारे में क्षमा करें।
OMG पॉनीज़ डेस

<> समान है! = यह सरल था। लेकिन मुझे पता नहीं था :)
एमफारूकी

48

यह देखने के लिए कि फ़ील्ड NULL उपयोग है IS NULL, IS NOT NULLऑपरेटर नहीं।

MySql संदर्भ http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
ओपी केवल उन पंक्तियों के बारे में पूछ रहा है जिनके पास फोन 2 क्षेत्र में कुछ है। पूरा नहीं है सब कुछ है कि सचमुच खाली करने के लिए सेट नहीं है, यहां तक ​​कि खाली स्ट्रिंग ""। इवान ने कहा, '', या <> '' के रूप में स्वीकार किए गए उत्तर में कहा, खाली स्ट्रिंग या NULL मान नहीं लौटाएंगे। दूसरे शब्दों में, IS NOT NULL, का एक सबसेट है! = '', लेकिन वे समतुल्य नहीं हैं।
कोई भी

34

NULLस्ट्रिंग मानों की जाँच करें और खाली करें :

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

NB मुझे लगता है कि COALESCE () SQL मानक (-ish) है, जबकि ISNULL () नहीं है।


1
आपको ट्रिम फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है, क्योंकि MySQL में किसी भी स्थान की एक स्ट्रिंग किसी भी संख्या में रिक्त स्थान की एक स्ट्रिंग के बराबर है, मैंने इस पर उत्तर में कुछ विस्तार से लिखा है stackoverflow.com/a/ 42723975/728236
ब्रायन लीशमैन

25

एक उत्तर जो मैं उपयोग कर रहा हूं वह मेरे लिए बहुत अच्छा काम कर रहा है जो मैंने पहले से ही यहां नहीं देखा था (यह प्रश्न बहुत पुराना है, इसलिए यह तब काम नहीं कर सकता है) वास्तव में है

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

उस > ''हिस्से पर ध्यान दें , जो यह जांच करेगा कि क्या मूल्य शून्य नहीं है, और यदि मूल्य सिर्फ व्हाट्सएप या रिक्त नहीं है।

मूल रूप से, यदि फ़ील्ड में व्हाट्सएप के अलावा कुछ है या NULL, यह सच है। यह, सुपर कम भी है, इसलिए इसमें लिखने के लिए आसान है, और पर एक और प्लस COALESCE()और IFNULL()कार्यों कि इस सूचकांक के अनुकूल है, के बाद से आप कुछ भी करने के लिए एक मैदान पर एक समारोह के उत्पादन की तुलना नहीं कर रहे हैं है।

परीक्षण के मामलों:

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

अद्यतन इस बात के लिए एक चेतावनी है कि मुझे उम्मीद नहीं थी, लेकिन शून्य या उससे नीचे के संख्यात्मक मान एक रिक्त स्ट्रिंग से अधिक नहीं हैं , इसलिए यदि आप उन संख्याओं के साथ काम कर रहे हैं जो शून्य या नकारात्मक हो सकते हैं तो यह न करें , यह मेरे लिए बहुत हाल ही में था और डिबग करना बहुत मुश्किल था :(

यदि आप स्ट्रिंग्स (चार, वर्चर, टेक्स्ट इत्यादि) का उपयोग कर रहे हैं, तो यह पूरी तरह से ठीक होगा, बस न्यूमेरिक्स से सावधान रहें।


17

यदि अनजाने डेटा प्रविष्टि से फोन 2 क्षेत्र में रिक्त स्थान हैं, तो आप IFNULL और TRIM के साथ उन रिकॉर्डों को अनदेखा कर सकते हैं:

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

आपको ट्रिम फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है, क्योंकि MySQL में किसी भी स्थान की एक स्ट्रिंग किसी भी संख्या में रिक्त स्थान की एक स्ट्रिंग के बराबर है, मैंने इस पर उत्तर में कुछ विस्तार से लिखा है stackoverflow.com/a/ 42723975/728236
ब्रायन लीशमैन

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

6
ध्यान दें कि एक बीच एक अंतर है कि NULLमूल्य और एक खाली स्ट्रिंग ''जो है एक मूल्य। यदि आप एक खाली स्ट्रिंग के खिलाफ जांचना चाहते हैं, column <> ''तो अन्य उत्तरों द्वारा सुझाए अनुसार उपयोग करें ।
डिझुनेट

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

आपके डिफ़ॉल्ट मान के आधार पर कुछ ट्वीक की आवश्यकता हो सकती है। यदि आपने नल को भरने की अनुमति दी है, तो आप इसके बजाय "Not NULL" कर सकते हैं, जो स्पष्ट रूप से बेहतर है।


मैं आपको नीचे चिह्नित नहीं करूंगा लेकिन: 1) NOT()MySQL 2 में कोई फ़ंक्शन phone2=""नहीं है ) यह किसी भी SQL सिंटैक्स चेकर को अतीत नहीं बनाएगा।
OMG पॉनिस

1
हे, सॉरी। मैं विभिन्न एसक्यूएल सर्वर का उपयोग करता हूं।
सात्विकप्यूप

2

हम कुछ char या स्ट्रिंग के लिए रिक्त मान सेट करने के लिए CASE का उपयोग कर सकते हैं। मैं NA का उपयोग कर रहा हूँ डिफ़ॉल्ट स्ट्रिंग के रूप में।

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

2

एक अन्य विकल्प CHAR_LENGTHस्तंभ मानों पर विशेष रूप से देखना है। (भ्रमित होने की नहीं LENGTH)

एक मापदंड जहां चरित्र लंबाई 0 से अधिक है, का उपयोग करते हुए इस तरह के एक मूल्य के साथ एक पूर्णांक स्तंभ की स्थिति में के रूप में गलत परिणामों की जब स्तंभ मान falsey हो सकता है, से बचने जाएगा 0या NULL। अलग-अलग डेटा-प्रकारों में अधिक लगातार व्यवहार करना।

जिसके परिणामस्वरूप कोई भी मूल्य है जो कम से कम 1 वर्ण लंबा है, या अन्यथा खाली नहीं है।

उदाहरण https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

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

तालिका डेटा

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) > 0परिणाम (एक ही)

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

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

वैकल्पिक

phone2 <> ''परिणाम (अलग)

users
813-123-4567       | 1

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

phone2 > ''परिणाम (अलग)

users
813-123-4567       | 1

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

COALESCE(phone2, '') <> ''परिणाम (एक ही)
नोट: परिणाम भिन्न होते हैं phone2 IS NOT NULL AND phone2 <> ''जो अपेक्षित नहीं है

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

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

phone2 IS NOT NULL AND phone2 <> ''परिणाम (अलग)

users
813-123-4567       | 1

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

2

हैरानी की बात है (जैसा कि पहले किसी और ने इसका उल्लेख नहीं किया) ने पाया कि नीचे की स्थिति काम करती है:

WHERE ORD(field_to_check) > 0 

जब हमें शून्य और खाली दोनों मानों को बाहर करने की आवश्यकता होती है। क्या किसी को दृष्टिकोण के डाउनसाइड के बारे में पता है?


ive सिंटेक्स को सही करने के लिए घंटों तक प्रयास कर रहा है और यह सब कुछ धन्यवाद को हल करता है!
डेमो 7

1

उपयोग:

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

1
मैंने देखा कि कभी-कभी IS NOT NULLकेवल रिक्त मानों ( '') के साथ स्तंभों को लागू करने के लिए लागू नहीं किया जाता है । मुझे पता नहीं क्यों, लेकिन सिर्फ इसे इंगित करना चाहता था। t.phone2 <> ''खाली स्ट्रिंग कॉलम की जाँच करते समय इसका उपयोग करना समझदारी है।
द्झुनेयट

0

आप इसे प्राप्त करने के लिए ऑपरेटर वाइल्डकार्ड की तरह उपयोग कर सकते हैं:

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

इस तरह, आप सभी फोन 2 प्राप्त कर सकते हैं जिनमें एक संख्या उपसर्ग है।


0

मेरे मामले में मेरे पास एक varchar कॉलम था, दोनों के तरीके IS NOT NULLऔर != '' काम नहीं करते थे , लेकिन निम्नलिखित ने मेरे लिए काम किया। बस यहीं लगा रहा हूं।

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.