এসকিউএল কীভাবে নাল মানগুলি তৈরি করবেন তা আরোহণের বাছাইয়ের সময় শেষ হয়


297

আমার একটি ডেটটাইম ক্ষেত্র সহ একটি এসকিউএল টেবিল রয়েছে। প্রশ্নের ক্ষেত্রটি শূন্য হতে পারে। আমার একটি জিজ্ঞাসা রয়েছে এবং আমি তারিখের সময় ক্ষেত্রের অনুসারে ফলগুলি বাছাই করতে চাই, তবে আমি সারিগুলি চাই যেখানে ডেটটাইম ক্ষেত্র তালিকার শেষে শূন্য থাকে, শুরুতে নয়।

এটি সম্পাদন করার কোনও সহজ উপায় আছে?



উত্তর:


394
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate

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

2
সুবিধা এবং অসুবিধাগুলি সহ সম্ভাব্য সকল উপায় সহ উত্তম উত্তর এখানে দেওয়া হয়েছে nickstips.wordpress.com/2010/09/30/…
SudhAnsu63

40
order by case when MyDate is null then 1 else 0 endসত্যিই বলা দীর্ঘ পথORDER BY MyDate IS NULL
মার্টিন

5
@ মার্টিন নোট এই প্রশ্নটি mysql ট্যাগ করা হয় না। আমি একটি সাধারণ সমাধান সরবরাহ করেছি - বিভিন্ন ডিবিএসে একই জিনিস করার বিভিন্ন উপায় রয়েছে।
রেডফিল্টার

1
@ কাইলডেলানী কারণ order by 0একটি কলাম সূচী হিসাবে ব্যাখ্যা করা হয়, এবং কলাম সূচী 1-ভিত্তিক। 3 য় কলাম অনুসারে একটি ক্যোয়ারী বাছাই করতে আপনি বলতে পারেন order by 3(যা উত্পাদন প্রশ্নগুলির জন্য একটি ভয়ঙ্কর ধারণা), তবে *পরীক্ষার সময় খুব সহজ (যেমনটি হয় )।
রেডফিল্টার

159

(একটি "বিট" দেরীতে, তবে এটি মোটেও উল্লেখ করা হয়নি)

আপনি আপনার ডিবিএমএস নির্দিষ্ট করেন নি।

স্ট্যান্ডার্ড এসকিউএল (এবং সর্বাধিক আধুনিক ডিবিএমএস যেমন ওরাকল, পোস্টগ্র্রেএসকিউএল, ডিবি 2, ফায়ারবার্ড, অ্যাপাচি ডার্বি, এইচএসকিউএলডিবি এবং এইচ 2) আপনি নির্দিষ্ট করতে পারেন NULLS LASTবা NULLS FIRST:

NULLS LASTএগুলি শেষ পর্যন্ত বাছাই করতে ব্যবহার করুন :

select *
from some_table
order by some_column DESC NULLS LAST

16
আফাইক NULLS FIRSTএবং NULLS LASTএসকিউএল: 2003 এ যুক্ত করা হয়েছে তবে বিভিন্ন ডিএমবিএস জুড়ে কোনও মানক প্রয়োগ নেই ' ডাটাবেস ইঞ্জিনের উপর নির্ভর করে ORDER BY expr some_column DESC NULLS LAST(ওরাকল), ORDER BY ISNULL(some_column, 1), some_column ASC( ORDER BY ISNULL(some_column), some_column ASCএমএসএসকিউএল ) বা (মাইএসকিউএল একটি ভিন্ন আইএসএনএলএল () বাস্তবায়ন) ব্যবহার করুন।
SaschaM78

3
@ সাছাএম 78: এনইউএলএসের ডিফল্ট বাছাই করা ডিবিএমএস নির্ভর। কিছু শেষে তাদের সাজান, কিছু শুরুতে। কেউ কেউ নালার সাথে ASC/ DESCনিয়ে বিরক্ত করেন না। সুতরাং এটি নিশ্চিত করার একমাত্র উপায় হ'ল এটি NULL FIRST/LAST যদি ডিবিএমএস সমর্থন করে তবে to এটিতে আপনি যা চান তা দলিল করেisnull()বা অন্যান্য ফাংশনগুলির ব্যবহার হ'ল NULLS FIRST/LAST(যেটি ওরাকল, পোস্টগ্রিএসকিউএল, ডিবি 2, ফায়ারবার্ড, অ্যাপাচি ডার্বি, এইচএসকিউএলডিবি এবং এইচ 2 দ্বারা
সমর্থিত

আপনি পুরোপুরি ঠিক বলেছেন, আমি কেবল এই সত্যটি যুক্ত করতে চেয়েছিলাম যে প্রায় বেশ কয়েকটি ডিবিএমএস রয়েছে যা মানক (এখনও) অনুসরণ করে না বা exprনুলস প্রথম / শেষ ব্যবহারের সময় ওরাকলের মতো কী বিশেষত কীওয়ার্ডের প্রয়োজন হয় their এবং প্রথম / শেষ ডাটাবেস টাইপ থেকে টাইপ ধীরে ধীরে নাল দেখানো হচ্ছে সম্পর্কে ধন্যবাদ, জানেন না!
SaschaM78

2
এটি আশাব্যঞ্জক দেখাচ্ছে, তবে দুঃখের বিষয়, আমি এটি চেষ্টা করেছি এবং NULLS LASTআমার মাইএসকিউএল ডাটাবেসে কাজ করি নি।
অ্যাডমিরালথ্রন

1
@ অ্যাডমিরাল অ্যাডামা: আপনি সর্বদা পোস্টগ্রাসে আপগ্রেড করতে পারেন
এ_ ঘোড়া_বিহীন_নাম_নামা

35

আমি কেবল এটি পেরিয়ে গিয়েছি এবং নিম্নলিখিতগুলি আমার জন্য মাইএসকিউএল এবং পোস্টগ্রেএসকিউএলে কৌশলটি করেছে বলে মনে হচ্ছে:

ORDER BY date IS NULL, date DESC

https://stackoverflow.com/a/7055259/496209 তে পাওয়া গেছে


এই সৌন্দর্য প্রতিশ্রুতি, কিন্তু দুঃখিতভাবে, আমি এটা চেষ্টা এবং IS NULLএবং IS NOT NULLআমার মাইএসকিউএল ডাটাবেসের মধ্যে কাজ করে নি।
অ্যাডমিরালথ্রন

14
order by coalesce(date-time-field,large date in future)

10
যদিও এটি সাধারণত কার্যকর হবে, তবে এটি লক্ষ করা উচিত যে এই উত্তরের কয়েকটি সমস্যা রয়েছে: ভবিষ্যতে বড় তারিখটি প্রকৃত ডেটার সাথে সংঘর্ষে বা কম হতে পারে, যার ফলে একটি অপূর্ণতা বাছাই হয়। এছাড়াও, এটি একটি "ম্যাজিক নম্বর" সমাধান যা স্ব-ডকুমেন্টিং নয়।
রেডফিল্টার

যখন আপনাকে প্রশ্নে থাকা কলামটি অন্য তারিখের কলামের সাথে তুলনা করতে হবে তখন এটি @RedFilter উত্তরের একটি দুর্দান্ত বিকল্প হতে পারে। আমি এটি ইউনিয়ন জ্যেষ্ঠতা তালিকার জন্য ব্যবহার করি। যদি কর্মচারীর একটি যোগ্য তারিখ থাকে (যা বাতিল হয়), তবে সেই তারিখটি শীর্ষে রেকর্ড করে, অন্যথায় হায়ারডেট ব্যবহার করুন। ISNULL (QualifiedDate, '1-1-2099'), HireDate, LastName, ইত্যাদির মাধ্যমে অর্ডার ব্যবহার করা যোগ্যতার তারিখটিকে HiredDate তারিখের সাথে বিরোধী করে না এবং সঠিক বৌদ্ধিক তালিকা তৈরি করা হয়।
অ্যালান ফিশার

14

নীচের মতো নাল বা নাল নয় তা পরীক্ষা করতে আপনি বিল্ট-ইন ফাংশনটি ব্যবহার করতে পারেন। আমি এটি এবং এর কাজ সূক্ষ্ম পরীক্ষা।

select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;


এমএসকিউএল নিয়ে কাজ করার তারিখগুলির জন্য আমি ISNULL ফাংশনে যেমন ISNULL (মাইডেট, '2100-01-01')
এমি-সি

মাইএসকিউএলে, এটি বলেছে যে আমি অনেকগুলি পরামিতিগুলি পার করছি। আমি এটি করে পার্স করতে পেরেছি ISNULL(MyDate) DESC, MyDate ASC, তবে এটি সঠিক ক্রমে সাজানো হয়নি।
অ্যাডমিরালথ্রন

12

যদি আপনার ইঞ্জিন এটির অনুমতি দেয় ORDER BY x IS NULL, xবা ORDER BY x NULLS LASTব্যবহার করে। তবে এটি যদি না সহায়তা করে:

আপনি যদি একটি সংখ্যার প্রকার অনুসারে বাছাই করেন তবে আপনি এটি করতে পারেন: ( অন্য উত্তর থেকে স্কিমা ধার করা ))

SELECT *          
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

শেষ অবধি নালাগুলি দিয়ে ডিপার্টমেন্টাল আইড অনুসারে বাছাই করা ফলাফল দেখাচ্ছে

যে কোনও নন-নাল সংখ্যা 0 হয়ে যায় এবং নালগুলি 1 হয়, যা নালকে সর্বশেষে সাজায়।

আপনি স্ট্রিংয়ের জন্য এটিও করতে পারেন:

SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

সর্বশেষ নাল দিয়ে লাস্টনাম অনুসারে সাজানো ফলাফল দেখাচ্ছে

কারণ 'a'> ''

এটি খাঁজ দেওয়ার জন্য অন্তর্ভুক্ত করে এবং উপরের ইনটগুলির জন্য পদ্ধতিটি ব্যবহার করে খেজুরগুলির সাথে কাজ করে:

SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate

(স্কিমার ভাড়ায় আসুন হায়ারডেট রয়েছে))

এই পদ্ধতিগুলি প্রতিটি ধরণের একটি "সর্বাধিক" মান নিয়ে আসা বা পরিচালনা করা বা ডেটা টাইপ (এবং সর্বাধিক) পরিবর্তিত হয় (উভয় সমস্যা যা অন্যান্য ইসনাল সমাধান ভুগছে) উভয়ই সমাধান করতে সমস্যা এড়ায়। এছাড়াও তারা একটি CASE এর চেয়ে অনেক খাটো।


এটি আমার পক্ষে কাজ করেছে। ভাল সমাধান।
ডেমোক্র্যাটস

দুর্দান্ত কাজ! আপনাকে ধন্যবাদ
ভানি

7

যখন আপনার অর্ডার কলামটি সংখ্যাসূচক হবে (র‌্যাঙ্কের মতো) আপনি এটিকে -1 দিয়ে গুণতে পারেন এবং তারপরে উত্থানের অর্ডার দিতে পারেন। এটি আপনার অন্বেষণ করা ক্রমটি রক্ষা করবে তবে নূন্যতমটি রাখবে।

select *
from table
order by -rank desc

এই সম্পর্কে মন্তব্য করতে চলেছিলাম। এটি স্ট্যাকওভারফ্লো.com/a/8174026/1193304 থেকে শিখেছি এবং এটি দুর্দান্ত
ক্রিস


3

ধন্যবাদযোগ্য ডেটটাইম ফিল্ড বাছাইয়ের বাগিং ইস্যুতে দুর্দান্ত সমাধান দেওয়ার জন্য রেডফিল্টারকে ধন্যবাদ।

আমি আমার প্রকল্পের জন্য এসকিউএল সার্ভার ডাটাবেস ব্যবহার করছি।

ডেটটাইম নাল মানটিকে '1' এ পরিবর্তন করা ডেটটাইম ডেটাটাইপ কলামের জন্য বাছাইয়ের সমস্যার সমাধান করে। তবে যদি আমাদের ডেটটাইম ডেটাটাইপ ব্যতীত অন্য কলাম থাকে তবে তা হ্যান্ডেল করতে ব্যর্থ।

একটি ভারচার কলামের সাজানোর জন্য, আমি 'ZZZZZZZ' ব্যবহার করার চেষ্টা করেছি কারণ আমি জানতাম যে কলামটির 'জেড' দিয়ে শুরু হওয়া মান নেই। এটি আশানুরূপ কাজ করেছিল।

একই লাইনে, প্রত্যাশা অনুযায়ী বাছাই করতে আমি int এবং অন্যান্য ডেটা ধরণের জন্য সর্বাধিক মান +1 ব্যবহার করেছি। এটি আমাকে প্রয়োজনীয় ফলাফলও দিয়েছে।

যাইহোক, ডাটাবেস ইঞ্জিন নিজেই এমন কিছু করতে পারে এমন কিছু সহজ করার পক্ষে সর্বদা আদর্শ হবে:

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

A_horse_with_no_name দ্বারা প্রদত্ত উত্তরে উল্লিখিত হয়েছে।


3

ওরাকল-এ আপনি ব্যবহার করতে পারেন NULLS FIRSTবা NULLS LAST: সুনির্দিষ্ট নয় যে NULL মানগুলি N-NULL মানগুলির আগে / পরে ফিরে আসা উচিত:

ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }

উদাহরণ স্বরূপ:

ORDER BY date DESC NULLS LAST

রেফ: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html


3

আপনি MariaDB ব্যবহার করেন, তাহলে তারা নিম্নলিখিত উল্লেখ নাল মান ডকুমেন্টেশন

ক্রমানুসার

আপনি যখন এমন কোনও ক্ষেত্রের মাধ্যমে অর্ডার করেন যেখানে নুল মানগুলি থাকতে পারে, কোনও এনইউএলকে সর্বনিম্ন মান বলে মনে করা হয়। সুতরাং ডিইএসসি অর্ডারে অর্ডার দেওয়ার ফলে এনএইউএলগুলি সর্বশেষ প্রদর্শিত হবে। NULLs কে সর্বোচ্চ মান হিসাবে গণ্য করতে বাধ্য করতে, প্রধান ক্ষেত্রটি যখন NULL হয় তখন একটির অন্য কলাম যুক্ত করতে পারে যার উচ্চতর মান থাকে। উদাহরণ:

SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;

প্রথমে NULL সহ, উতরাই অর্ডার:

SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;

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

উপরেরগুলি NULL মান দ্বারা অর্ডার করার দুটি উপায় দেখায়, আপনি এএসসি এবং ডিইএসসি কীওয়ার্ডগুলির সাথে এটিও একত্র করতে পারেন। উদাহরণস্বরূপ, নুল মানগুলি পাওয়ার অন্যান্য উপায় হ'ল:

SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
--                                         ^^^^

2

"কেস" ব্যবহার করে সমাধান সর্বজনীন, তবে তারপরে সূচকগুলি ব্যবহার করবেন না।

order by case when MyDate is null then 1 else 0 end, MyDate

আমার ক্ষেত্রে, আমার অভিনয় দরকার ছিল needed

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

1
আপনি যদি পারফরম্যান্সে আগ্রহী হন তবে আপনার ব্যবহার করা উচিত UNION ALL
রেডফিল্টার


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