সংখ্যা হিসাবে এসকিউএল অর্ডার স্ট্রিং


137

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

এটি তাদের বাছাই করার সময় সংখ্যার মতো নয় চরিত্র হিসাবে গ্রহণ করছে।

ডাটাবেসে আমার আছে

1 2 3 4 5 6 7 8 9 10...

আমার পৃষ্ঠায় এটি আদেশ মতো তালিকাটি দেখায়:

1 10 2 3 4 5 6 7 8 9

আমি কীভাবে এটিকে আরোহণের সংখ্যা অনুসারে অর্ডার করতে পারি?


5
অবশ্যই আপনার স্ট্রিংয়ের পরিবর্তে একটি সংখ্যা হিসাবে ডেটা সংরক্ষণ করা উচিত।
ওডে

@ ওডে আপনার কিছু স্বেচ্ছাচারিত তথ্য থাকতে পারে (উদাঃ সেটিংস), যা আপনি খুব বিশেষ ক্ষেত্রে কেবল তার সংখ্যাসূচক মান অনুসারে অর্ডার করতে চান।
গ্লুটেক্সো

অত্যন্ত আকর্ষণীয় নিবন্ধ -
এমএসএসকিউএল এর

উত্তর:


256

যদি সম্ভব হয় তবে আপনার যদি কলামের ডেটা ধরণটি কোনও সংখ্যায় পরিবর্তন করা উচিত তবে আপনি যদি কেবল যেকোনভাবে নম্বর সংরক্ষণ করেন।

আপনি যে কি না পারেন, তাহলে তারপর আপনার কলাম মান নিক্ষেপ integer স্পষ্টভাবে সঙ্গে

select col from yourtable
order by cast(col as unsigned)

বা পরোক্ষভাবে একটি গাণিতিক অপারেশন সঙ্গে উদাহরণস্বরূপ নম্বরে একটি রূপান্তর বাধ্য করে যা

select col from yourtable
order by col + 0

বিটিডাব্লু মাইএসকিউএল স্ট্রিংগুলি বাম থেকে ডানে রূপান্তর করে। উদাহরণ:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */

3
কর্নেল * 1 দ্বারা অর্ডার নিখুঁত কাজ করে। এর পিছনে যাদু কী? দুঃখিত আমি পেশাদার নই তাই এটি মূর্খ প্রশ্ন হতে পারে তবে * 1 কীভাবে এটি সংখ্যায় পরিবর্তিত হয়?
জামোল 4'12

12
মাইএসকিউএল স্বয়ংক্রিয়ভাবে স্ট্রিংটিকে একটি সংখ্যায় রূপান্তরিত করে1
জুরিজেন ডিস

1
প্রথম বিকল্পটি সবচেয়ে উপযুক্ত, দ্বিতীয়টির একটি অতিরিক্ত পদক্ষেপ রয়েছে, তবে এটি কম ব্যবহার করে non
মানাটেক্স

5
এবং যদি আপনার কাছে স্ট্রিং এবং সংখ্যা মিশ্রিত থাকে এবং সেগুলি উভয়ই বাছাই করতে চান তবে "আদেশটি কল * 1, কল" ব্যবহার করুন
হেডেন থ্রিং

1
@ সুফেরফোনিক: ফলাফল হবে decimal
জুয়ার্জেন d

70

একক কাস্ট ব্যবহার না করে অন্য উপায় using

(যারা JPA 2.0 ব্যবহার করেন তাদের পক্ষে, যেখানে কোনও ingালাই অনুমোদিত নয়)

select col from yourtable
order by length(col),col

সম্পাদনা: শুধুমাত্র ধনাত্মক পূর্ণসংখ্যার জন্য কাজ করে


9
এটি একটি ভাল, এটি কলামের সাথে কাজ করেছে যা এতে
অন্তর্মুখী

1
এটি সব ক্ষেত্রে কার্যকর হবে না। মাথার শীর্ষে বন্ধ, যেসব ক্ষেত্রে কাজ করবে না সেগুলি হ'ল সম্পূর্ণ সংখ্যার মিশ্রণ; নেতিবাচক সংখ্যা, শীর্ষস্থানীয় শূন্য সহ সংখ্যা, ভগ্নাংশ এবং শব্দের সাথে সংখ্যা এবং সংযুক্ত সংখ্যা numbers
ওয়ান্ডার ওয়ার্কার


প্রথম দর্শনে কাজ করেছে বলে মনে হয় নি, তবে এটি কাজ করেছিল! ধন্যবাদ!
try2fly.b4ucry


17

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

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

ফলাফল

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

আশাকরি এটা সাহায্য করবে


আপনি কেবল 0 থেকে 1 এবং 1 - ISNUMERIC(ID)পরিবর্তে পরিবর্তে পরিবর্তে ব্যবহার করতে পারেন (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
এসস্পার্পোশন

7

এটি আমার পক্ষে কাজ করে।

select * from tablename
order by cast(columnname as int) asc

আপনি ব্যাখ্যা করতে পারেন কেন?
স্লাভিক

সর্বাধিক সহজ উত্তর, এটি যা প্রয়োজন ঠিক তা করে, স্ট্রিংটি কোনও
ইনটকে ফেলে দেয়, তারপরে ক্রমটি ক্রমবর্ধমান

4

রূপান্তর করার আরেকটি উপায়।

আপনার যদি স্ট্রিং ফিল্ড থাকে তবে আপনি এটিকে বা এর সংখ্যাসূচক অংশটিকে নীচের উপায়ে রূপান্তর করতে পারেন: সমস্ত দৈর্ঘ্যের সমান দৈর্ঘ্যের স্ট্রিং তৈরি করতে নেতৃস্থানীয় শূন্যগুলি যুক্ত করুন।

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

বা ক্ষেত্রের অংশ অনুসারে 'tensymbols13', 'tensymbols1222' ইত্যাদির অর্ডার করুন etc.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 

2

আমি এমন একটি বাছাইয়ের ক্ষেত্রও খুঁজছিলাম যেখানে অক্ষরের উপসর্গ থাকে। সমাধানটি আমি এখানে খুঁজে পেয়েছি। কে একই সমাধানের সন্ধান করছে এটি সহায়তা করতে পারে।

ক্ষেত্রের মানসমূহ:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9) আমি 9 রাখি কারণ 9 আমার পক্ষে সর্বোচ্চ 9 অঙ্কের পূর্ণসংখ্যার মান ধরে রাখতে পারে।

সুতরাং ফলাফলটি হবে 123456789 123456788 123456787 ... 100 99 ... 2 1


2

এটি নেতিবাচক সংখ্যা, ভগ্নাংশ, স্ট্রিং, সবকিছু পরিচালনা করবে:

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;

2

কে একই সমাধানের সন্ধান করছে এটি সহায়তা করতে পারে।

select * from tablename ORDER BY ABS(column_name)

0

আপনি যদি অ্যাডোনিসজেএস ব্যবহার করছেন এবং এবিসি -202, এবিসি -201 ... এর মতো মিশ্র আইডি রয়েছে, আপনি ক্যোয়ারী বিল্ডারের সাথে কাঁচা প্রশ্নগুলি একত্রিত করতে পারেন এবং উপরের সমাধানটি প্রয়োগ করতে পারেন ( https://stackoverflow.com/a/25061144/4040835 ) নিম্নরূপ:

const sortField =
  'membership_id'
const sortDirection =
  'asc'
const subquery = UserProfile.query()
  .select(
    'user_profiles.id',
    'user_profiles.user_id',
    'user_profiles.membership_id',
    'user_profiles.first_name',
    'user_profiles.middle_name',
    'user_profiles.last_name',
    'user_profiles.mobile_number',
    'countries.citizenship',
    'states.name as state_of_origin',
    'user_profiles.gender',
    'user_profiles.created_at',
    'user_profiles.updated_at'
  )
  .leftJoin(
    'users',
    'user_profiles.user_id',
    'users.id'
  )
  .leftJoin(
    'countries',
    'user_profiles.nationality',
    'countries.id'
  )
  .leftJoin(
    'states',
    'user_profiles.state_of_origin',
    'states.id'
  )
  .orderByRaw(
    `SUBSTRING(:sortField:,3,15)*1 ${sortDirection}`,
    {
      sortField: sortField,
    }
  )
  .paginate(
    page,
    per_page
  )

নোট: এই লাইন ইন: SUBSTRING(:sortField:,3,15)*1 ${sortDirection},

  1. '3' হ'ল সংখ্যার আগে সর্বমহলে অ-সংখ্যাগত অক্ষরের সূচক সংখ্যা। যদি আপনার মিশ্র আইডিটি "এবিসি -123" হয় তবে আপনার সূচী নম্বরটি 4 হবে।
  2. '15' হাইফেনের পরে যতগুলি সংখ্যক সম্ভব অঙ্ক করতে ব্যবহৃত হয়।
  3. '1' স্ট্রিংগুলিতে গাণিতিক ক্রিয়াকলাপ সম্পাদন করে যা কোনও সংখ্যায় সাবস্ট্রিংকে কার্যকরভাবে কাস্ট করে।

রেফ 1: আপনি কাঁচা প্রশ্নের মধ্যে প্যারামিটার বাইন্ডিং সম্পর্কে আরও পড়তে পারেন: https://knexjs.org/#Raw- বাইন্ডিংস রেফ 2: অ্যাডোনিস কাঁচা প্রশ্ন: https://adonisjs.com/docs/4.1/query-builder# _raw_queries


-3

আপনার ক্ষেত্রটি VARCHAR এর পরিবর্তে INT হতে পরিবর্তন করুন।

অন্য কিছু নির্ভরশীল পরিস্থিতির কারণে আমি তাদের INT করতে পারি না।

তারপরে নির্ভরশীল পরিস্থিতিতে প্রথমে ঠিক করুন। অন্যথায় আপনি আসল অন্তর্নিহিত ইস্যুটি নিয়ে কাজ করছেন। মাইএসকিউএল CAST ব্যবহার করা একটি বিকল্প, তবে এটি আপনার খারাপ স্কিমাটি মাস্ক করে যা ঠিক করা উচিত।

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