একটি এসকিউএল সার্ভার কোয়েরিতে 0 টি দিয়ে NULL প্রতিস্থাপন করা হচ্ছে


175

আমি একটি কোয়েরি তৈরি করেছি এবং আমি প্রাপ্ত প্রথম তিনটি কলামের ফলাফলে NULL। আমি কীভাবে এটির সাথে প্রতিস্থাপন করতে পারি 0?

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

@ user2246674 প্রথম তিনটি কলাম: সমষ্টি (কেস যখন c.runstatus = 'সাফল্য' তারপর 1 শেষ) হিসাবে সফল হয়েছে, যোগ (কেস যখন c.runstatus = 'ব্যর্থ' তারপর 1 প্রান্ত) ব্যর্থ হিসাবে, যোগ (কেস যখন c.runstatus = 'বাতিল হয়েছে' তারপরে 1 শেষ) বাতিল হিসাবে
ভাস্কর মিশ্র

স্পার্কি, ওরাকল এনভিএল বা এনভিএল 2 ব্যবহার করা পৃথক নয় ... ওরাকল
বেস /

উত্তর:


376

আপনি যখন nullঅন্য কোনও কিছুর সাথে সম্ভাব্য কলামটি প্রতিস্থাপন করতে চান , ইসনুল ব্যবহার করুন

SELECT ISNULL(myColumn, 0 ) FROM myTable

এটি প্রথম স্থানে শূন্য হলে এটি আমার কলামে 0 রাখবে।


2
যারা এসকিউএল সার্ভার 2000 বা 2005 ব্যবহার করছেন তাদের জন্য এসএনকিউএল সার্ভার ২০০৮ এবং তারপরের।
কাইল

1
একাধিক কলামের জন্য আমাকে একাধিকবার ইসনুল লিখতে হবে নাকি ইসনুলের মতো কিছু আছে (মাইআর কলাম, 0)?
ফ্লুড্রে

@ কাইল: এটি ভুল: ব্যক্তিগত অভিজ্ঞতা (এবং একটি বইয়ের উদ্ধৃতি ) থেকে, আমি নিশ্চিত করতে পারি যে আইএসএনএলএল সমর্থিত (কমপক্ষে) এসকিউএল সার্ভার 2000 থেকে সম্ভবত এটিরও আগে।
হেইনজি

@ ফ্লাড্রে: আপনাকে একাধিক বার লিখতে হবে, যেহেতু প্রতিটি আউটপুট কলামের নিজস্ব প্রকাশ থাকতে হবে।
হেইঞ্জি

এটি এসকিউএল সার্ভার ২০১ 2016-এ সঠিক ফলাফল পেতে আমাকে সহায়তা করে Thanks অনেক ধন্যবাদ, আপনি সবেমাত্র আমার দিনটি @ ফাডাফঙ্ক করেছেন
প্যাটসনলাইনার

83

আপনি এই দুটি পদ্ধতি ব্যবহার করতে পারেন তবে পার্থক্য রয়েছে:

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

COALESCE () এবং ISNULL () এর তুলনা করা:

  1. ISNULL ফাংশন এবং COALESCE এক্সপ্রেশনটির একই উদ্দেশ্য রয়েছে তবে ভিন্ন আচরণ করতে পারে।

  2. ISNULL একটি ফাংশন কারণ এটি একবারে মূল্যায়ন করা হয় once উপরে বর্ণিত হিসাবে, COALESCE প্রকাশের ইনপুট মানগুলি একাধিকবার মূল্যায়ন করা যায়।

  3. ফলাফল প্রকাশের ডেটা টাইপ নির্ধারণ আলাদা। আইএসএনএলএল প্রথম প্যারামিটারের ডেটা ধরণ ব্যবহার করে, কোএলএসসিইএসএএসএস অভিব্যক্তি নিয়ম অনুসরণ করে এবং সর্বোচ্চ ধরণের নজির সহ ডাটা টাইপের মান প্রদান করে।

  4. ফলাফল প্রকাশের NULLability ISNULL এবং COALESCE এর জন্য পৃথক। ISNULL রিটার্ন মানটি সর্বদা নালযোগ্য নয় (ধরে নেওয়া রিটার্ন মান একটি নন-অযোগ্য) তবে নন-নাল প্যারামিটার সহ COALESCE নাল হিসাবে বিবেচিত হয়। সুতরাং এক্সপ্রেশন ISNULL (NULL, 1) এবং COALESCE (NULL, 1) যদিও এর সমতুল্যের বিভিন্ন নালাগ্রতার মান রয়েছে। এটি যদি আপনি গণিত কলামগুলিতে এই এক্সপ্রেশনগুলি ব্যবহার করছেন, মূল সীমাবদ্ধতা তৈরি করছেন বা একটি স্কেলার ইউডিএফ ডিটারিনিস্ট্যান্টিকের রিটার্ন মান তৈরি করছেন যাতে এটি নীচের উদাহরণে প্রদর্শিত হিসাবে সূচকযুক্ত হতে পারে তবে এটি একটি ত্রুটি তৈরি করে।

- এই বিবৃতি ব্যর্থ হয়েছে কারণ প্রাথমিক কী মূল ন্যূনতম মানগুলি গ্রহণ করতে পারে না - এবং কল 2 এর জন্য COALESCE এক্সপ্রেশনটির ন্যূনযোগ্যতা - নূলে মূল্যায়ন করে।

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0) PRIMARY KEY, 
    col3 AS ISNULL(col1, 0) 
); 

- এই বিবৃতিটি সফল হয়েছে কারণ - ISNULL ফাংশনের অকার্যকরতার মূল্যায়ন মূল্যায়ন করে না।

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. ISNULL এবং COALESCE এর জন্য বৈধতা পৃথক। উদাহরণস্বরূপ, আইএসএনএলএল এর জন্য একটি নুল মান ইন্টিতে রূপান্তরিত হয় তবে কোয়েলসইয়ের জন্য আপনাকে অবশ্যই একটি ডেটা টাইপ সরবরাহ করতে হবে।

  2. ISNULL মাত্র 2 টি পরামিতি নেয় যেখানে COALESCE একটি পরিবর্তনশীল সংখ্যক পরামিতি নেয়।

    আপনি যদি আরও জানতে চান তবে এখানে এমএসডিএন-এর সম্পূর্ণ নথি


23

সহ coalesce:

coalesce(column_name,0)

যদিও, সংশ্লেষ যেখানে when condition then 1, আপনি ঠিক তেমন সহজে পরিবর্তন sumকরতে পারেন count- যেমন:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)0 প্রদান করে, যখন sum(null)শূন্য ফেরত দেয়)


10

আপনি যখন প্রথম তিনটি কলাম বলছেন তখন কি আপনার SUMকলামগুলি বোঝায় ? যদি তা হয় তবে ELSE 0আপনার CASEবক্তব্যগুলিতে যুক্ত করুন। SUMএকটি এর NULLমান NULL

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 


7

এই কোডটিতে আপনার কলামটি মুড়িয়ে দিন।

 ISNULL(Yourcolumn, 0)

আপনি কেন নাল পাচ্ছেন তা পরীক্ষা করে দেখুন


6

ব্যবহার করুন COALESCE, যা প্রথম নয়-নাল মান যেমন

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

সফল হিসাবে 0 হিসাবে সেট করা হবে যদি এটি হিসাবে ফিরে আসে NULL


1

আপনার কেস স্টেটমেন্টগুলিতে অন্য একটি যুক্ত করুন যাতে পরীক্ষার শর্তটি পাওয়া না গেলে তারা শূন্যে ডিফল্ট হয়। এই মুহুর্তে যদি পরীক্ষার শর্তটি না পাওয়া যায় তবে NUL এসইউএম () ফাংশনে প্রেরণ করা হচ্ছে।

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

1

আপনি যদি Presto, AWS অ্যাথেনা ইত্যাদি ব্যবহার করেন তবে কোনও ISNULL () ফাংশন নেই। পরিবর্তে, ব্যবহার করুন:

SELECT COALESCE(myColumn, 0 ) FROM myTable

0
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

এখানে সমস্যাটি হ'ল অন্য বিবৃতি ব্যতীত, কলামের বিবরণে রান স্থিতি বর্ণিত স্থিতি না হলে আপনি একটি নাল গ্রহণ করতে বাধ্য। নূলে কিছু যুক্ত করার ফলে নুল হবে এবং এটি এই প্রশ্নের সাথে এই সমস্যা with

শুভকামনা!


0

পূর্ববর্তী উত্তরগুলি অনুসরণ করে আমি এসকিউএল সার্ভার ডিবিতে আমার কলামের নামটি হারাচ্ছিলাম তবে এই বাক্য গঠনটি অনুসরণ করে আমাকে পাশাপাশি কলামের নাম ধরে রাখতে সহায়তা করেছে

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