মাইএসকিউএল অর্ডার দিয়ে একটি নম্বর, নুলস শেষ


279

বর্তমানে আমি আমার বিবৃতিতে খুব বেসিক অর্ডারবাই করছি।

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

এর সাথে সমস্যা হ'ল 'পজিশন' এর জন্য ন্যূনুল এন্ট্রিগুলি 0 হিসাবে গণ্য করা হয় Therefore উদাহরণ:

NULL, NULL, NULL, 1, 2, 3, 4

নিম্নলিখিত ক্রমটি অর্জন করার কোনও উপায় আছে:

1, 2, 3, 4, NULL, NULL, NULL.

8
আপনার ব্যবহারকারীর 1052645 এর উত্তরটি পুনর্বিবেচনা করা উচিত। এটি সহজ, সর্বোচ্চ মান সম্পর্কে জ্ঞানের প্রয়োজন নেই এবং এটি দ্রুত হতে পারে (ধরে নেওয়া একটি ফাংশন কলের চেয়ে কোনও এক্সপ্রেশনকে মূল্যায়ন করা দ্রুত হতে পারে)।
স্টিভ ক্লে

উত্তর:


566

মাইএসকিউএল-এ নালাগুলি শেষ স্থানে বাছাই করার জন্য একটি অননুমোদিত সিনট্যাক্স রয়েছে। কলামের নামের আগে একটি বিয়োগ চিহ্ন (-) রাখুন এবং ASC কে DESC এ স্যুইচ করুন:

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

এটি মূলত position DESCNULL মান রাখার বিপরীত কিন্তু অন্যথায় একই position ASC

একটি ভাল রেফারেন্স এখানে http://troels.arvin.dk/db/rdbms#select-order_by


79
এটি বিনা দলিলভুক্ত নয়, - col_nameএটি একটি অভিব্যক্তি ( 0 - col_name), যা অর্ডার বাই দফা গ্রহণ করে। অবশ্যই এটি কেবল সংখ্যা কলামগুলির জন্য কাজ করে।
স্টিভ ক্লে

7
সুন্দর. জন্য কাজ করে dateএবং timeকলাম খুব! (মাইএসকিউএল 5.5)। আমার ধারণা (আমি পরীক্ষা করতে অলস) এটি সমস্ত সংখ্যার মতো কলামগুলির জন্য কাজ করে (টাইমস্ট্যাম্প, ভাসা ...)।
মার্টিন

6
@ কোড়াল: এটি একটি সরল (এবং দরকারী) গণিত প্রকাশ যা ক্রমকে বিপরীত করে, ভাষাটি নিজে নাটকীয়ভাবে পরিবর্তিত না হলে এটি সরানো হবে না।
বেল

11
মতামতগুলি যেমন পরামর্শ দেয়, এটি সংখ্যা, তারিখ এবং সময় কলামগুলির জন্য কাজ করে? তবে, বর্ণের কী হবে? এটি কি বার্চের জন্যও প্রয়োগ করা যেতে পারে? আমি এটি ভারচর ক্ষেত্রগুলিতে প্রয়োগ করার চেষ্টা করেছি, তবে ASC বা DESC ব্যবহারের চেয়ে অর্ডারটি আলাদা বলে মনে হচ্ছে।
সুমিত দেশাই

9
এটি কলাম দ্বারা আদেশে কোনও সম্ভাব্য সূচির ব্যবহারকে আটকাবে না?
তারসিস

305

আমি এটি বেশিরভাগ অংশের জন্য একটি ভাল সমাধান বলে মনে করেছি:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;

6
কাজের দ্বারা অর্ডারটির নতুন সংজ্ঞা ছাড়াই: SELECT * FROM table ORDER BY ISNULL(field) ASC;(মাইএসকিউএল 5.5)
মারিয়াল জুয়ান

5
এটি একটি ভাল সমাধান।
রোক ক্রালজ

4
গৃহীত সমাধান পোস্টগ্রাফিকেল 9.3-এ টাইমস্ট্যাম্পের সাথে কাজ করে না। এই সমাধানটি করে ...
কালু

2
বিরক্তিকরভাবে, মাইএসকিউএল ক্ষেত্রটিতে কোনও সূচক ব্যবহার করবে না যখন আপনি ধারা দ্বারা আদেশ সীমাতে (সীমা ব্যবহার করার সময়) যোগ করবেন field
ব্যারি কেলি

3
@ কালু: পোস্টগ্রিসকিউএল-তে , নুল মানগুলি সর্বশেষ ক্রম অনুসারে বাছাই করা হয় (এবং প্রথম অবতরণ ক্রমে)। আর তুমি বরং ব্যবহার করেন আদর্শ SQL দফা NULLS LAST| NULLS FIRSTএখানে workarounds পরিবর্তে এটি উল্টাতে।
এরউইন ব্র্যান্ডসেটেটার

23

কিছুটা এইরকম

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

999999999 প্রতিস্থাপন ক্ষেত্রের জন্য সর্বাধিক মানটি কী


3
এই সমাধানটি ভঙ্গুর এবং মাঝে মাঝে বাগগুলি হতে পারে
দিমিত্রি বোগদানোভিচ

20

শেষ পর্যন্ত

SELECT * FROM table_name ORDER BY id IS NULL, id ASC

4

আপনি প্রথমে (0 বা -1) বা শেষ (বড় সংখ্যা বা একটি চিঠি) বাছাই করতে আলাদা মান সহ ন্যূনএলএল এর উদাহরণগুলি সরিয়ে নিতে পারেন ...

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC

এটি সমস্যার সমাধান করবে না কেননা অর্ডার বাইতে সূচিত সূচকটি SELECT বিবৃতিতে মানগুলি প্রতিস্থাপনের দ্বারা প্রভাবিত হবে না এবং এর ফলে ক্রমটি সংশোধন করবে না। এছাড়াও, COALESCE ফাংশনটি দেখুন, যা আপনার কার্যকারিতা আইএফ ফাংশনটি ব্যবহারের সমতুল্য is
সংজ্ঞায়িত

আপনি যদি আইএফ স্টেটমেন্টটি সঠিকভাবে উপন্যাস করেন তবে সারিগুলি আপনার প্রত্যাশা অনুযায়ী অর্ডার করা হবে। আমি আমার উদাহরণ স্থির করেছি।
ল্যাংডন

4

এই কোয়েরিটি ব্যবহার করে দেখুন:

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC

মামলার দরকার নেই। এক্সপ্রেশনটি ন্যূনাল হলে আইটি নল 1 প্রদান করে। রিভারবিনেশন এর উত্তর দেখুন।
কন্টাক্টমেট

3

আপনি করতে পারেন একসঙ্গে বেড়ে ওঠা আপনার NULLs মানের ORDER BYবিবৃতি:

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

আপনি যদি নীলগুলি নীচে বাছাই করতে চান তবে চেষ্টা করুন coalesce(position, 100000)। ( positionডিবিতে থাকা সমস্তের চেয়ে দ্বিতীয় নম্বরটি বড় করুন ))


3
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC

6
ওপিকে কেন এই চেষ্টা করা উচিত ? ভাল উত্তরগুলির ক্ষেত্রে সর্বদা কী করা হয়েছিল এবং কেন এটি করা হয়েছিল তার ব্যাখ্যা থাকবে, কেবল ওপি-র জন্যই নয়, ভবিষ্যতে এসও-তে আগত দর্শকদের জন্যও এই প্রশ্নটি খুঁজে পেতে পারে এবং আপনার উত্তরটি পড়তে পারে।
রিগসফলি

2

একটি DATEকলামের জন্য আপনি ব্যবহার করতে পারেন:


নালস শেষ:

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

খালি শেষ:

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC

1

নিম্নলিখিত ফলাফল অর্জন করতে:

1, 2, 3, 4, NULL, NULL, NULL.

সিনট্যাক্সটি ব্যবহার করুন, -(minus sign)ক্ষেত্রের নামের আগে স্থাপন করুন এবং বিপরীত অর্ডার_ টাইপ ব্যবহার করুন (যেমন: আপনি যদি ASC আদেশে আদেশ চান তবে DESC ব্যবহার করুন বা যদি আপনি DESC ক্রম চান তবে ASC ব্যবহার করুন)

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC


1

এটি ভাল কাজ করছে:

SELECT * FROM tablename ORDER BY position = 0, position ASC;

position
1 
2
3
0
0

-8

আপনি নুলস শেষের মাধ্যমে কেন অর্ডার দিচ্ছেন না?

SELECT * 
FROM tablename
WHERE visible = 1 
ORDER BY position ASC NULLS LAST, id DESC 

NULLS LAST- মাইএসকিউএল এর কোন সংস্করণ চালু হয়েছিল?
crmpicco

2
@ পানিক, আপনার মানে (এমএস) এসকিউএল সার্ভার?
d -_- বি

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