মাইএসকিউএল নির্বাচন কেবল নাল মান নয়


264

এটি কি এমন একটি নির্বাচনী বিবৃতি করা সম্ভব যা কেবলমাত্র ন্যূন মানগুলিকেই নেয় না?

এখনই আমি এটি ব্যবহার করছি:

SELECT * FROM table

এবং তারপরে আমাকে পিএইচপি লুপ দিয়ে নাল মানগুলি ফিল্টার করতে হবে।

করার উপায় আছে কি:

SELECT * (that are NOT NULL) FROM table

?

এখনই যখন আমি নির্বাচন করি * আমি ভাল 1, ভাল 2, ভাল 3, নাল, ভাল 4, ভাল 5, নাল, নাল ইত্যাদি পেয়ে যাচ্ছি .... তবে আমি কেবল আমার ফলাফলটিতে শূন্য নয় এমন মানগুলি পেতে চাই। একটি লুপ দিয়ে ফিল্টারিং ছাড়া এটি কি সম্ভব?


2
কিছু স্তম্ভের নাল মান এবং অন্যান্য কলামগুলির নাল মান না থাকলে এমন সারি থাকলে আপনি কী হতে চান?
মার্ক বাইয়ার্স

আমি কেবল যে কলামগুলি শূন্য নয় সেগুলি থেকে কেবল মানগুলি পেতে চাই এবং কেবল সারিতে থাকা কলামের মানগুলি ফিরিয়ে আনতে চাই। এই মুহূর্তে আমি তাদের ছাঁটাতে একটি লুপ ব্যবহার করি, লুপ ছাড়াই এটি করা সম্ভব?
ব্রায়ান সামন

1
@ ব্রায়ান - আপনার টেবিলের কাঠামো কী? সব কলামে কি একই ডেটাটাইপ থাকে?
মার্টিন স্মিথ

1
@ ব্রায়ান - তাহলে আপনার আদর্শ ফলাফলটি কেমন হবে? সমস্ত নাল মান সহ একটি কলামের ফলাফল সেট? উদাহরণস্বরূপ ডেটা এবং পছন্দসই ফলাফল সহ আপনার প্রশ্নটি সম্পাদনা না করা সহায়ক হবে ...
মার্টিন স্মিথ

2
@ ব্রায়ান - আপনার টেবিলটিতে কলামগুলিতে পুনরাবৃত্তি গোষ্ঠীগুলি থাকতে পারে বলে মনে হচ্ছে? (উইকি নিবন্ধটি ব্যাখ্যা এবং প্রস্তাবিত বিকল্প কাঠামোর জন্য দেখুন যদি সে ক্ষেত্রে হয় তবে এন.ইউইকিপিডিয়া.র.উইকি / ফার্স্ট_আরমনাল_ফর্ম )
মার্টিন স্মিথ

উত্তর:


452

আপনার ব্যবহার করা উচিত IS NOT NULL। (তুলনা অপারেটরদের =এবং <>উভয় দিতে UNKNOWNসঙ্গে NULLমত প্রকাশের উভয় পাশে।)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

কেবলমাত্র সম্পূর্ণতার জন্য আমি উল্লেখ করব যে মাইএসকিউএলে আপনি নাল নিরাপদ সমতা অপারেটরটিকেও অস্বীকার করতে পারেন তবে এটি স্ট্যান্ডার্ড এসকিউএল নয়।

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

মন্তব্য প্রতিফলিত সম্পাদিত। দেখে মনে হচ্ছে আপনার টেবিলটি প্রথম স্বাভাবিক ফর্মের মধ্যে নাও থাকতে পারে যেখানে কাঠামো পরিবর্তন করা আপনার কাজটি আরও সহজ করে তুলতে পারে। এটি করার আরও কয়েকটি উপায় যদিও ...

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*/

উপরের অসুবিধাটি হ'ল এটি প্রতিটি কলামের জন্য একাধিকবার টেবিলটি স্ক্যান করে। এটি সম্ভবত নীচে এড়ানো যেতে পারে তবে আমি মাইএসকিউএলে এটি পরীক্ষা করি নি।

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
অনেক অনেক ধন্যবাদ .. এটি সাহায্য করেছে :)
DfrDkn

শেষ পদ্ধতির ক্ষেত্রে, আপনি CASEবিবৃতি ব্যবহার করেছিলেন , কাজ করে না CASE। তাই না এটি হওয়া উচিত END CASEপরিবর্তে END মধ্যে SELECT CASE ...অংশ?
ইসতিয়াক আহমেদ

বিশেষজ্ঞ না-হওয়া লোকদের জন্য, আপনি কি শেষ সমাধানটি ব্যাখ্যা করতে পারেন? না idx ROM প্রথম SELECTথেকে আসা idxদ্বিতীয় SELECT? CASEবিবৃতিটি কী সম্পাদন করার চেষ্টা করে? দ্বিতীয়টি SELECTআসলে কী করে ? এবং আপনি একটি অভ্যন্তরীণ যোগদান করছেন, ক্রস যোগ না, তাই না?
ইসতিয়াক আহমেদ

আমি মনে করি না এটি প্রশ্নের উত্তর দেয়। এটি শোনা গেল যেন ওপি (আমি একটি নির্দিষ্ট ধরে নিই) সারিটি নির্বাচন করতে চেয়েছিলাম তবে সেই ফলাফল থেকে সমস্ত কলামগুলি বাতিল হয়ে গেছে - এই উত্তরটির জন্য আপনাকে কোনটি কলাম বাতিল করতে দেওয়া হচ্ছে না তা নির্দিষ্ট করা দরকার (যা সম্পূর্ণ আলাদা সমস্যা) বা সমস্ত কলামগুলি নির্দিষ্ট করুন, অনেকগুলি কলাম সহ টেবিলের জন্য অনুপযুক্ত
সিএসই

(যেমন লাইন ধরে কিছু SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

আপনি একটি নির্দিষ্ট কলামে একটি নুল মান ধারণ করে এমন সারিগুলি ফিল্টার আউট করতে পারেন:

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

আপনি যদি কোনও কলামে নাল ধারণ করে এমন সারিগুলি ফিল্টার করতে চান তবে এটি চেষ্টা করুন:

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

আপডেট: আপনার মন্তব্যের ভিত্তিতে, সম্ভবত আপনি এটি চান?

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

এবং আমি মার্টিনের সাথে একমত যে আপনাকে যদি এটি করার দরকার হয় তবে আপনার সম্ভবত আপনার ডাটাবেসের নকশাটি পরিবর্তন করা উচিত।


আমি নিশ্চিত না যে আমি এটি যথেষ্ট ভাল ব্যাখ্যা করেছি কিনা তবে আমি আরও ভাল চেষ্টা করব try এখনই যখন আমি নির্বাচন করি * আমি ভাল 1, ভাল 2, ভাল 3, নাল, ভাল 4, ভাল 5, নাল, নাল ইত্যাদি পেয়ে যাচ্ছি .... তবে আমি কেবল আমার ফলাফলটিতে শূন্য নয় এমন মানগুলি পেতে চাই। একটি লুপ দিয়ে ফিল্টারিং ছাড়া এটি কি সম্ভব?
ব্রায়ান সামন

@ ব্রায়ান - আপনি কী কী কলাম *রিটার্নগুলি ব্যাখ্যা করতে পারবেন ? আপনার প্রশ্নে কিছুটা উদাহরণস্বরূপ ডেটা সরবরাহ করুন কারণ এটি আপনার সমস্ত মন্তব্য থেকে পরিষ্কার নয় যে এটি সমস্ত কলামই নয়।
মার্টিন স্মিথ

এই মুহূর্তে, * আমার সমস্ত মান সারিতে ফিরিয়ে দেয়। অর্থাত্ Val1, ভাল 2, ভাল 3, নাল, ভাল 4, ভাল 5, নাল, নাল। তবে আমি এটি কেবল যে কলাম মানগুলি নਾਲ নয় তা ফিরিয়ে দিতে চাই। ফলাফলটি ফেরতের পরে মানগুলি ফিল্টার করার জন্য আমি এখন এটি একটি লুপ দিয়ে করি।
ব্রায়ান সামন

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

এই পদ্ধতির একমাত্র অসুবিধা হ'ল আপনি কেবল 5 টি কলামের তুলনা করতে পারবেন, তার পরে ফলাফলটি সর্বদা মিথ্যা হবে, তাই আমি কেবল ক্ষেত্রগুলি তুলন করতে পারি NULL


8

আমি এই সমাধানটি পেয়েছি:

এই কোয়েরিটি প্রতিটি কলামের জন্য সর্বশেষ নাল মান নির্বাচন করে।

উদাহরণ


আপনার যদি একটি টেবিল থাকে:

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

তুমি পাও:

title|body
t3   |b2

প্রশ্ন


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

আমি আপনাকে সাহায্য আশা করি।


GROUP_CONCAT (দেহ) AS দেহ
রবীন্দ্র সিং

2

আমি \!মাইএসকিউএল- র কমান্ডটি শেল থেকে ন্যূন্য মানগুলি বের করতে ব্যবহার করি :

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

এটি .my.cnfযেখানে আপনার ডাটাবেস / ব্যবহারকারীর নাম / পাসওয়ার্ড নির্দিষ্ট করা হয়েছে সেখানে সঠিকভাবে কাজ করে। এই ভাবে আপনি শুধু আপনার ঘিরে আছে selectসঙ্গে \! mysql eএবং | grep -v NULL


1

নিম্নলিখিত জিজ্ঞাসা আমার জন্য কাজ করে

যখন আমি তখন কলাম 'নুল' এর ডিফল্ট মান সেট করেছি

select * from table where column IS NOT NULL

এবং যখন আমি তখন ডিফল্ট মান সেট করে থাকি

select * from table where column <>''


0

মাইএসকিউএল যোগ দেয় এবং নির্বাচন করে না, অন্তর্ভুক্ত করুন, যুক্ত করুন এবং যুক্তিযুক্ত অপারেটর পছন্দ করুন বা না

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;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.