মাইএসকিউএল কোয়েরিতে পাঠ্যকে সংখ্যায় রূপান্তর করুন


138

মাইএসকিউএল কোয়েরির মধ্যে পাঠ্যকে সংখ্যায় রূপান্তর করা কি সম্ভব? আমার একটি শনাক্তকারীর সাথে একটি কলাম রয়েছে যাতে "নাম নাম্বার" ফর্ম্যাটে একটি নাম এবং একটি সংখ্যা থাকে। কলামটিতে VARCHAR প্রকার রয়েছে। আমি সংখ্যাগুলি (একই নামের সারি) অনুসারে বাছাই করতে চাই তবে কলামটি অক্ষরের ক্রম অনুসারে বাছাই করা হয়েছে, অর্থাৎ

name-1
name-11
name-12
name-2

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

name-1
name-2
name-11
name-12

আমি আলাদা কলাম হিসাবে নম্বরটি উপস্থাপন করতে পারি না।

2011-05-11 9:32 সম্পাদিত

আমি নিম্নলিখিত সমাধান খুঁজে পেয়েছি ... ORDER BY column * 1। যদি নামটিতে কোনও নম্বর থাকে না তবে কী সমাধানটি ব্যবহার করা সংরক্ষণ করা যায়?


1
নাম ঠিক নাম নাকি এটি কোনও চরিত্র হতে পারে? আমি বলতে চাইছি: এটি স্ট্রিং চারটি অক্ষর দীর্ঘ বা আসল নাম?
মার্কো

nameঅক্ষরের যে কোনও ক্রম হতে পারে।
সিজুক

উত্তর:


256

এই কাজ করা উচিত:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1
আপনি কি ডকুমেন্টেশনের একটি ব্যাখ্যা এবং একটি লিঙ্ক যুক্ত করতে পারেন?
অ্যাঞ্জেলো ফুকস

আমার স্ট্রিংটি "name-abc12" এর মতো। আপনার কোড যুক্ত করে, এটি কেবল তখনই কাজ করে যদি "-" পরে প্রাথমিক অক্ষর একটি অক্ষর দিয়ে শুরু না হয়। @ মারকো আপনি কি আমাকে কোনও শর্ত ছাড়াই চিঠিগুলি উপেক্ষা করার উপায় বলতে পারেন?
এডুয়ার্ডো

1
@ এডোয়ার্ডো আমার ক্যোয়ারিতে স্ট্রিংটি "-" এর পরে পাওয়ার এবং এটি একটি সংখ্যায় রূপান্তরিত করার কথা রয়েছে (এটি একটি সংখ্যার হতে হবে)। আপনার ক্ষেত্রে আমি সম্ভবত একটি নিয়মিত প্রকাশটি ব্যবহার করতাম ...
মার্কো

@ মার্কোর নিয়মিত অভিব্যক্তি এটি করেছে, টিপটির জন্য আপনাকে ধন্যবাদ।
এডুয়ার্ডো

32

আপনি ব্যবহার করতে পারেন SUBSTRINGএবং CONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

name_column"নাম-" মান সহ কলামটি কোথায় । SUBSTRINGষষ্ঠ চরিত্র সামনে অপসারণ সবকিছু আপ (অর্থাত "name-" উপসর্গ) এবং তারপর CONVERTধর্মান্তরিত একটি বাস্তব পূর্ণসংখ্যা উপর ত্যাগ করেন।

আপডেট : মন্তব্যের পরিবর্তন পরিস্থিতিতে দেওয়া (যেমন উপসর্গ কিছু হতে পারে), আপনি একটি নিক্ষেপ করতে হবে LOCATEমিশ্রণ মধ্যে:

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

এটি অবশ্যই ধরে নিয়েছে যে অ-সংখ্যাসূচক উপসর্গটির কোনও হাইফেন নেই তবে প্রাসঙ্গিক মন্তব্যটি বলে যে:

name অক্ষরের যে কোনও ক্রম হতে পারে

যাতে এটি একটি নিরাপদ অনুমান করা উচিত।


আমার মন্তব্যের জবাবে তিনি আমাদের বলেছিলেন নাম কোনও চরিত্রের ক্রম হতে পারে, সুতরাং আপনি ব্যবহার করতে পারবেন তা নিশ্চিত নই SUBSTRING(name_column, 6)। আমি জানি, আপনি এটি পোস্ট করেছিলেন যখন তিনি আমাদের এই কথাটি বলেন নি ...
মার্কো

@ মার্কো: শীর্ষস্থানীয়দের জন্য ধন্যবাদ, আমি একটি আপডেট যুক্ত করেছি যা উপসর্গগুলি সম্পর্কে নতুন তথ্যের যত্ন নেওয়া উচিত। তবে হ্যাঁ, আপনার SUBSTRING_INDEX আরও সুন্দর।
মিউ খুব ছোট

23

কেবল CAST ব্যবহার করুন,

CAST(column_name AS UNSIGNED)

কাস্ট ফলাফলের ধরণটি নিম্নলিখিত মানগুলির মধ্যে একটি হতে পারে:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

14

স্ট্রিং থেকে ইনটে রূপান্তর করতে আপনি CAST () ব্যবহার করতে পারেন । যেমনSELECT CAST('123' AS INTEGER);


15
যে সংস্করণ নির্দিষ্ট? আমার এটি ব্যবহার করতে হবে SELECT CAST('123' AS SIGNED INTEGER);বা SELECT CAST('123' AS UNSIGNED INTEGER);এটি কাজ করতে হবে।
হাবো

10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1
আপনি কি নিশ্চিত যে অর্ডার বাই কনভার্ট না ব্যবহার করে একটি সংখ্যা হিসাবে নাম ব্যবহার করে? আমি নিশ্চিত নই, তবে এটি হতে পারে .. আমি কেবল নিজেকে জিজ্ঞাসা করছি :)
মার্কো

4

একটি সহজ উপায় '123' + 0 নির্বাচন করুন


যদিও এই কোডটি সমস্যা সমাধানে সহায়তা হতে পারে, কেন এবং / অথবা এটি কীভাবে প্রশ্নের উত্তর দেয় সে সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে এর দীর্ঘমেয়াদী মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা কিছু ব্যাখ্যা যোগ করার জন্য আপনার উত্তর।
টবি স্পিড 9

এটি প্রশ্নের উত্তর দেয় নি তবে এটিই আমি উত্তর খুঁজছিলাম।
সাগর শাহ

আপনার সমাধানটি সর্বাধিক মার্জিত এবং ব্যবহারিক - দুর্ভাগ্যক্রমে আপনি নির্দিষ্ট প্রসঙ্গে নির্দিষ্ট উদাহরণের সাথে প্রশ্নের প্রসঙ্গে এটি সরবরাহ করেন নি - দয়া করে এটি নির্দিষ্ট করে সংশোধন করুন।
চুক্কো

2

নম্বর পেতে চেষ্টা করুন SUBSTRING_INDEX(field, '-', 1)তারপর রূপান্তর করুন।


2
আপনার 1 থেকে -1 পরিবর্তন করতে হবে। dev.mysql.com/doc/refman/5.0/en/…
গৌরব

2

যদি আপনার প্রাথমিক কীটি

এবিসি / ইএফজি / ইই / 13/123 (ক্রম সংখ্যা) এর মতো বিন্যাসে একটি স্ট্রিং হয় তবে
এই ধরণের স্ট্রিংটি ডিলিমিটারের সাথে বাছাইয়ের জন্য সহজেই ব্যবহার করা যেতে পারে ("/")

এই ধরণের কী সহ একটি টেবিল অর্ডার করতে আমরা নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারি

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC


-5

করার একটি সাধারণ উপায়:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.