postgresql 0 ফেরত মান যদি শূন্য হয়


106

আমার কাছে একটি ক্যোয়ারী রয়েছে যা গড় (মূল্য) দেয়

  select avg(price)
  from(
      select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
      where listing_Type='AARM'
        and u_kbalikepartnumbers_id = 1000307
        and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
        and price>( select avg(price)* 0.50
                    from(select *, cume_dist() OVER (ORDER BY price desc)
                         from web_price_scan
                         where listing_Type='AARM'
                           and u_kbalikepartnumbers_id = 1000307
                           and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
                        )g
                   where cume_dist < 0.50
                 )
        and price<( select avg(price)*2
                    from( select *, cume_dist() OVER (ORDER BY price desc)
                          from web_price_scan
                          where listing_Type='AARM'
                            and u_kbalikepartnumbers_id = 1000307
                            and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
                        )d
                    where cume_dist < 0.50)
     )s

  having count(*) > 5

যদি কোনও মান উপলব্ধ না হয় তবে এটি 0 ফেরত কীভাবে করবেন?


4
আপনি কি নিশ্চিত যে আপনার ক্যোয়ারীটি ভালভাবে গঠিত?
লুক এম

4
@ লুকম: এটি একটি সুগঠিত ক্যোয়ারী হতে পারে না। ("ধারা" দ্বারা "গোষ্ঠীবিহীন" ধারা থাকা ")
মাইক শেরিল 'ক্যাট রিকল'

সব কিছু ঠিকঠাক কাজ করে, কখনও কখনও যখন নিয়মগুলি মেটানো হয় না তখন কিছুই ফিরে আসে না। তদতিরিক্ত, আমি কীভাবে গড় হিসাবে গর্প করতে পারি, আমি মনে করি না এটি সম্ভব কিনা || কী কথা? একাধিক নির্বাচন from web_price_scanপৃথক নির্বাচন; নিশ্চিত না এখানে সমস্যা কি?
অ্যান্ড্রু

এটি havingছাড়াই একটি ধারা ব্যবহার করা ঠিক আছে group by(যা একক গোষ্ঠীতে ডিফল্ট হয়)। এটি whereসামগ্রিক ফলাফলের একটি ধারা হিসাবে কাজ করে। এই ক্ষেত্রে, 5 টিরও বেশি সারি 1 ম স্তরের সাবকিউরির দ্বারা প্রত্যাবর্তিত হলে কেবল সারিগুলি ফেরত দেওয়া হবে।
ব্রুস্কেয়াস

উত্তর:


186

coalesce ব্যবহার করুন

COALESCE(value [, ...])
The COALESCE function returns the first of its arguments that is not null.  
Null is returned only if all arguments are null. It is often
used to substitute a default value for null values when data is
retrieved for display.

সম্পাদনা করুন

COALESCEআপনার প্রশ্নের সাথে এখানে উদাহরণ দেওয়া আছে :

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND COALESCE( price, 0 ) > ( SELECT AVG( COALESCE( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND COALESCE( price, 0 ) < ( SELECT AVG( COALESCE( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5

আইএমএইচও এর COALESCEসাথে ব্যবহার করা উচিত নয় AVGকারণ এটি মানটি সংশোধন করে। NULLমানে অজানা এবং আর কিছুই নয়। এটি ব্যবহার করার মতো নয় SUM। এই উদাহরণে, যদি আমরা প্রতিস্থাপন AVGদ্বারা SUM, ফলে বিকৃত করা হয় না। যোগফলের সাথে 0 যোগ করা কারও ক্ষতি করে না তবে অজানা মানগুলির জন্য 0 দিয়ে গড় গণনা করে আপনি আসল গড় পান না।

সেক্ষেত্রে, আমি যোগ হবে price IS NOT NULLWHEREদফা এই অজানা মান এড়ানো।


4
@ অ্যান্ড্রু আমি আপনার ক্যোয়ারীটি ব্যবহার করে আপনাকে একটি উদাহরণ দেওয়ার চেষ্টা করছিলাম। তবে আমি হারিয়ে যাই। আমি সন্দেহ করি যে এই ক্যোয়ারীটি কাজ করে। from web_price_scan...পুনরাবৃত্তি বলে মনে হচ্ছে ...
লুক এম

যারা ভাবছেন তাদের NULLIF(v1, v2)পক্ষে এর বিপরীতে কি সমান হলে COALESCEএটি ফিরে আসে । NULLv1v2
এসএম

25

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


এখানে দুটি স্বতন্ত্র "সমস্যা" রয়েছে, প্রথমটি যদি কোনও টেবিল বা subquery এর কোনও সারি না থাকে, দ্বিতীয়টি যদি কোয়েরিতে NULL মান থাকে।

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

$ create table foo (bar int);
CREATE TABLE

$ select avg(bar) from foo;
 avg 
-----

(1 row)

$ select coalesce(avg(bar), 0) from foo;
 coalesce 
----------
        0
(1 row)

$ insert into foo values (3);
INSERT 0 1
$ insert into foo values (9);
INSERT 0 1
$ insert into foo values (NULL);
INSERT 0 1
$ select coalesce(avg(bar), 0) from foo;
      coalesce      
--------------------
 6.0000000000000000
(1 row)

অবশ্যই, "থেকে ফু" থেকে "থেকে (... এখানে যে কোনও জটিল যুক্তি ...)" foo হিসাবে প্রতিস্থাপন করা যেতে পারে "

এখন, টেবিলের NULL সারিটি 0 হিসাবে গণনা করা উচিত? তারপরে coalesce ব্যবহার করতে হবে গড় কলের অভ্যন্তরে।

$ select coalesce(avg(coalesce(bar, 0)), 0) from foo;
      coalesce      
--------------------
 4.0000000000000000
(1 row)

3

আমি এটি অর্জনের 2 টি উপায় সম্পর্কে ভাবতে পারি:

  • IFNULL ():

    IFNULL () ফাংশনটি একটি নির্দিষ্ট মান প্রদান করে যদি এক্সপ্রেশনটি NULL হয় I

বাক্য গঠন:

IFNULL(expression, alt_value)

আপনার প্রশ্নের সাথে IFNULL () উদাহরণ:

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND IFNULL( price, 0 ) > ( SELECT AVG( IFNULL( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND IFNULL( price, 0 ) < ( SELECT AVG( IFNULL( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5
  • সমবেত হত্তয়া()

    COALESCE () ফাংশন একটি তালিকার প্রথম নন-মান প্রদান করে।

বাক্য গঠন:

COALESCE(val1, val2, ...., val_n)

আপনার ক্যোয়ারির সহিত COALESCE () এর উদাহরণ:

SELECT AVG( price )
FROM(
      SELECT *, cume_dist() OVER ( ORDER BY price DESC ) FROM web_price_scan
      WHERE listing_Type = 'AARM'
        AND u_kbalikepartnumbers_id = 1000307
        AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
        AND COALESCE( price, 0 ) > ( SELECT AVG( COALESCE( price, 0 ) )* 0.50
                                     FROM ( SELECT *, cume_dist() OVER ( ORDER BY price DESC )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) g
                                    WHERE cume_dist < 0.50
                                  )
        AND COALESCE( price, 0 ) < ( SELECT AVG( COALESCE( price, 0 ) ) *2
                                     FROM( SELECT *, cume_dist() OVER ( ORDER BY price desc )
                                           FROM web_price_scan
                                           WHERE listing_Type='AARM'
                                             AND u_kbalikepartnumbers_id = 1000307
                                             AND ( EXTRACT( DAY FROM ( NOW() - dateEnded ) ) ) * 24 < 48
                                         ) d
                                     WHERE cume_dist < 0.50)
     )s
HAVING COUNT(*) > 5

4
IFNULL () পোস্টগ্র্রেসে কোনও ফাংশন নয়। এটি অন্যান্য ডাটাবেসে কাজ করতে পারে তবে প্রশ্নটি বিশেষত পোস্টগ্র্রেস সম্পর্কে।
জন উইলসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.