কোনও কলাম শূন্য হলে পরীক্ষা করুন


16

আমি একটি সহজ ক্যোয়ারীটি বের করার চেষ্টা করছি যা আমি যদি টেবিলে করতে পারি যে কোনও বৃহত টেবিলের কোনও কলামে কমপক্ষে একটি ফাঁকা (NULL / খালি) মান আছে এমন এন্ট্রিগুলির একটি তালিকা রয়েছে কিনা তা পরীক্ষা করতে পারি।

আমার মতো কিছু দরকার

SELECT * FROM table AS t WHERE ANY(t.* IS NULL)

আমি করতে চাই না

SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL

এটি একটি বিশাল প্রশ্ন হবে।

উত্তর:


16

কম (পড়ুন: শূন্য) হাত-ঝাঁকুনির সাথে @ ডিবি 2 এর উত্তরের একটি বর্ধন:

DECLARE @tb nvarchar(512) = N'dbo.[table]';

DECLARE @sql nvarchar(max) = N'SELECT * FROM ' + @tb
    + ' WHERE 1 = 0';

SELECT @sql += N' OR ' + QUOTENAME(name) + ' IS NULL'
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb);

EXEC sys.sp_executesql @sql;

8

জেএনকে-র মন্তব্য অনুসারে আপনার সমস্ত কলামগুলি তালিকাভুক্ত করা উচিত।

WHERE c1 IS NULL OR c2 IS NULL OR c3 IS NULL

কিছুটা কম দক্ষ পদ্ধতির যা এড়ানো যায় এটি নীচে।

;WITH xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' AS ns) 
SELECT * 
FROM   YourTable AS T1 
WHERE (
    SELECT T1.* 
    FOR XML PATH('row'), ELEMENTS XSINIL, TYPE
  ).exist('//*/@ns:nil') = 1 

(এই এসও উত্তরের ভিত্তিতে)


5

এখানে কোনও সুন্দর অন্তর্নির্মিত বাক্য গঠন নেই, তবে ম্যানেজমেন্ট স্টুডিওতে কোয়েরিটি দ্রুত তৈরি করতে বেশ কয়েকটি সুবিধাজনক বৈশিষ্ট্য রয়েছে।

অবজেক্ট এক্সপ্লোরার-এ, আপনি যে সারণীটি চান তার নিচে ড্রিল করুন, এটি প্রসারিত করুন, তারপরে পুরো "কলামগুলি" ফোল্ডারটি ফাঁকা কোয়েরি সম্পাদনায় টেনে আনুন। এটি ক্যোয়ারীতে কমা-বিচ্ছিন্ন কলামগুলির তালিকা যুক্ত করবে।

এরপরে, অনুসন্ধান এবং প্রতিস্থাপনটি খুলুন। "কী সন্ধান করুন" সেট করুন ,এবং "প্রতিস্থাপন করুন" এ IS NULL OR(একটি শীর্ষস্থানীয় স্থানের সাথে) সেট করুন এবং তারপরে সমস্ত প্রতিস্থাপন করুন hit আপনার হাতে ক্রমটি শেষটি পরিষ্কার করতে হবে।

এটি এখনও কুৎসিত, তবে এটি শ্রমের নিবিড় কুশলী কম।


4

একাধিক সমাধান: এর জন্য কয়েকটি নাল, সমস্ত নাল, একক এবং একাধিক কলাম এবং আরও শীর্ষে 1 ব্যবহার করে দ্রুত তৈরি করা

যদি আপনার একাধিক কলাম পরীক্ষা করার প্রয়োজন হয় তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

Column_1 Column_2 Column_3
-------- -------- --------
1        2        NULL
1        NULL     NULL
5        6        NULL

প্রথমে NULL- র জন্য পরীক্ষা করুন এবং তাদের গণনা করুন:

select 
    sum(case when Column_1 is null then 1 else 0 end) as Column_1, 
    sum(case when Column_2 is null then 1 else 0 end) as Column_2, 
    sum(case when Column_3 is null then 1 else 0 end) as Column_3,
from TestTable 

NULL এর একটি গণনা দেয়:

Column_1  Column_2  Column_3
0         1         3

ফলাফল যেখানে 0, সেখানে কোনও NUL নেই।

দ্বিতীয়ত , আসুন নন-নুলগুলি গণনা করুন:

select 
    sum(case when Column_1 is null then 0 else 1 end) as Column_1, 
    sum(case when Column_2 is null then 0 else 1 end) as Column_2, 
    sum(case when Column_3 is null then 0 else 1 end) as Column_3,
from TestTable

... তবে যেহেতু আমরা এখানে নন-নুল গণনা করছি, এটিকে এখানে সরলীকৃত করা যেতে পারে:

select 
    count(Column_1) as Column_1, 
    count(Column_2) as Column_2, 
    count(Column_3) as Column_3,
from TestTable

হয় একটি ফলন:

Column_1  Column_2  Column_3
3         2         0

ফলাফল যেখানে 0, কলামটি সম্পূর্ণ NUL গুলি নিয়ে গঠিত।

শেষ অবধি , আপনার যদি কেবল একটি নির্দিষ্ট কলামটি পরীক্ষা করতে হয় তবে প্রথম 1 টি দ্রুত হয় কারণ এটি প্রথম হিট এ থামানো উচিত। তারপরে আপনি বুলিয়ান শৈলীর ফলাফল দেওয়ার জন্য optionচ্ছিকভাবে গণনা (*) ব্যবহার করতে পারেন:

select top 1 'There is at least one NULL' from TestTable where Column_3 is NULL

select count(*) from (select top 1 'There is at least one NULL' AS note from TestTable where Column_3 is NULL) a

0 = কোনও NULL নেই, 1 = কমপক্ষে একটি NULL রয়েছে

অথবা

select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL

select count(*) from (select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL) a

0 = এগুলি সমস্ত নুল, 1 = কমপক্ষে একটি নন-নুল রয়েছে

আশা করি এটা কাজে লাগবে.


যদিও এটি বেশ কার্যকর বলে মনে হচ্ছে, আমি এটি একটি অপরিহার্যতা বোধ করি যে ওপি যা চেয়েছিল তা নয় - তারা প্রতিটি সারির বিষয়বস্তুতে একটি নূন্যমূল্য অন্তর্ভুক্ত করেছিল, কোনও অস্তিত্ব আছে কিনা তা পরীক্ষা করে দেখার জন্য নয়।
আরডিফোজ

যথেষ্ট ফর্সা। আমি মনে করি আমি এটি অন্যভাবে পড়ছিলাম। আমি বড় টেবিলে ... "অংশ থাকলে" ... পরীক্ষার দিকে মনোনিবেশ করেছিলাম, সুতরাং ... বুলিয়ান (আমার ক্ষেত্রে বুলিয়ান-ইশ)। তবে যদি, "এন্ট্রিগুলির তালিকা" দ্বারা, তার অর্থ সারি, তবে আপনি একেবারে ঠিক।
jwolf

শুধু এটি পুনর্বিবেচনা। আমি অবশ্যই প্রশ্নের ভুল ব্যাখ্যা দিয়েছি - অনুমান করা উচিত ছিল যে তিনি ফলস্বরূপ সারিগুলি খুঁজছিলেন। আমি মনে করি তিনিও হুগ বলতে কী বোঝাতে চেয়েছিলেন তাও আমি ভুলভাবে লিখেছি। আমি প্রথমে ভেবেছিলাম যে তিনি গণনামূলকভাবে ব্যয়বহুল বলতে চাইছেন তবে এখন আমি কেবল মনে করি যে তিনি কলামগুলি দিয়ে প্রশস্ত করেছেন তাই অ্যারন এবং ডিবি 2 এটি সঠিকভাবে পঠন এবং সমাধান উভয় ক্ষেত্রেই পেয়েছেন (যার উপর নির্ভর করে আরও ক্লান্ত: আপনার মস্তিষ্ক বা আপনার আঙ্গুলগুলি)
জোল্ফ

2

UNPIVOT কলামগুলিকে সারিগুলিতে অনুবাদ করে। প্রক্রিয়াতে এটি নুল মান ( রেফারেন্স ) বাদ দেয় ।

ইনপুট দেওয়া হয়েছে

create table #t
(
    ID  int primary key,
    c1  int null,
    c2  int null
);

insert #t(id, c1, c2)
values
    (1, 12, 13),
    (2, null, 14),
    (3, 15, null),
    (4, null, null);

UNPIVOT ক্যোয়ারী

select
    ID, ColName, ColValue
from
(
    select *
    from #t
) as p
unpivot
(
    ColValue for ColName in
    (c1, c2)                  -- explicit source column names required
) as unpvt;

আউটপুট উত্পাদন করবে

| ID | ColName | ColValue |
|----|---------|----------|
| 1  | c1      | 12       |
| 1  | c2      | 13       |
| 2  | c2      | 14       |
| 3  | c1      | 15       |

দুঃখের বিষয় হচ্ছে সারি 4 সম্পূর্ণভাবে মুছে ফেলা হয়েছে কারণ এতে কেবলমাত্র শূন্যস্থান রয়েছে! উত্স ক্যোয়ারিতে একটি ডামি মান ইনজেকশনের মাধ্যমে এটি সুবিধামত পুনরায় চালু করা যেতে পারে:

select
    ID, ColName, ColValue
from
(
    select
        -5 as dummy,               -- injected here, -5 is arbitrary
        *
    from #t
) as p
unpivot
(
    ColValue for ColName in
    (dummy, c1, c2)                -- referenced here
) as unpvt;

আইডিতে সারিগুলি একত্রিত করে আমরা নন-মানগুলি গণনা করতে পারি। উত্স সারণীতে কলামগুলির মোট সংখ্যার সাথে তুলনা করলে এক বা একাধিক NULL থাকা সারিগুলি সনাক্ত করা যাবে।

select
    ID
from
(
    select -5 as dummy, *
    from #t
) as p
unpivot
(
    ColValue for ColName in
    (dummy, c1, c2)
) as unpvt
group by ID
having COUNT(*) <> 3;

আমি ইনজেকশনের ডামি কলামের জন্য
সোর্স টেবিল # টি
+ 1- তে কলামের সংখ্যা হিসাবে 3 গণনা করি
- আইডির জন্য 1, যা UNPIVOTED নয়

ক্যাটালগ টেবিলগুলি পরীক্ষা করে রানটাইম এ এই মানটি পাওয়া যায়।

ফলাফলগুলিতে যোগ দিয়ে মূল সারিগুলি পুনরুদ্ধার করা যেতে পারে।

যদি NULL ব্যতীত অন্য মানগুলি তদন্ত করতে হয় তবে সেগুলি এমন একটি ধারায় অন্তর্ভুক্ত করা যেতে পারে:

...
) as unpvt
where ColValue <> ''      -- will eliminate empty strings

আলোচনা

এটির জন্য একটি শনাক্তকারী প্রয়োজন যা UNPIVOT এর মাধ্যমে বহন করে। একটি চাবি সেরা হবে। কারও অস্তিত্ব না থাকলে ROW_NUMBER () উইন্ডো ফাংশন দ্বারা একটি ইনজেকশন দেওয়া যায় , যদিও এটি কার্যকর করা ব্যয়বহুল হতে পারে।

সমস্ত কলামগুলি UNPIVOT ধারাটির মধ্যে স্পষ্টভাবে তালিকাবদ্ধ থাকতে হবে। @ Db2 এর পরামর্শ অনুসারে এসএসএমএস ব্যবহার করে এগুলিকে টেনে আনা যায়। টেবিলে সংজ্ঞাটি যখন অ্যারোন বার্ট্র্যান্ডের পরামর্শ মতো হবে তখন গতিশীল হবে না। এটি প্রায় সকল এসকিউএল-র ক্ষেত্রে।

আমার বরং সীমিত ডেটা সেট করার জন্য এক্সিকিউশন প্ল্যান হ'ল একটি ক্লাস্টারড ইনডেক্স স্ক্যান এবং একটি স্ট্রিম সামগ্রিক। এটি টেবিলের সরাসরি স্ক্যান এবং প্রচুর ওআর ক্লজের চেয়ে মেমরির চেয়ে ব্যয়বহুল।

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