एसक्यूएल क्रम स्ट्रिंग संख्या के रूप में


137

मेरे पास VARCHARएक MySQL डेटाबेस के रूप में सहेजे गए नंबर हैं । मैं उन्हें INTकुछ अन्य परिस्थितियों के कारण नहीं बना सकता ।

यह उन्हें क्रमबद्ध करते हुए संख्या के रूप में नहीं चरित्र के रूप में ले रहा है।

डेटाबेस में मेरे पास है

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

मेरे पृष्ठ पर यह इस तरह से आदेशित सूची दिखाता है:

1 10 2 3 4 5 6 7 8 9

मैं इसे आरोही संख्याओं द्वारा कैसे आदेशित कर सकता हूं?


5
निश्चित रूप से आपको स्ट्रिंग के बजाय डेटा को एक संख्या के रूप में संग्रहीत करना चाहिए।
ओड

@Oded आपके पास कुछ मनमाने डेटा (जैसे सेटिंग्स) हो सकते हैं, जिन्हें आप केवल विशेष मामलों में इसके सांख्यिक मूल्य द्वारा ऑर्डर करना चाहते हैं।
ग्लुटेक्सो

: - बहुत ही दिलचस्प लेख MSSQL के लिए है, लेकिन के लिए MySQL अपेक्षाकृत समान होना चाहिए essentialsql.com/use-sql-server-to-sort-alphanumeric-values
AquaAlex

जवाबों:


256

यदि संभव हो तो आपको कॉलम के डेटा प्रकार को एक संख्या में बदलना चाहिए यदि आप केवल वैसे भी नंबर स्टोर करते हैं।

यदि आप ऐसा नहीं कर सकते हैं तो अपने कॉलम के मूल्य को integer स्पष्ट रूप से बताएं

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

या परोक्ष गणितीय प्रक्रिया के साथ उदाहरण के लिए संख्या के लिए एक रूपांतरण मजबूर करता है जो

select col from yourtable
order by col + 0

BTW MySQL तार को बाएँ से दाएँ परिवर्तित करता है। उदाहरण:

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 यह संख्या में कैसे बदलाव करता है?
जामोल

12
MySQL स्वचालित रूप से स्ट्रिंग को एक नंबर में परिवर्तित करता है1
juergen d

1
पहला विकल्प सबसे उपयुक्त है, दूसरे में एक अतिरिक्त कदम है, लेकिन यह कम काम करता है।
मैनाटैक्स

5
और यदि आपके पास मिश्रित स्ट्रिंग और संख्या है और उन दोनों को क्रमबद्ध करना चाहते हैं, तो "क्रम से कर्नल * 1, कॉल" का उपयोग करें
हेडन थ्रिंग

1
@ सुपरफ़ोनिक: परिणाम होगा decimal
juergen d

70

एक और तरीका, एक ही डाली का उपयोग किए बिना।

(JPA 2.0 का उपयोग करने वाले लोगों के लिए, जहां किसी भी कास्टिंग की अनुमति नहीं है)

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

संपादित करें: केवल सकारात्मक पूर्णांक के लिए काम करता है


9
यह एक अच्छा एक है, Thats ने कॉलम के साथ काम किया जिसमें int और string दोनों शामिल हैं
S.S. A.Suk

1
यह सभी मामलों में काम नहीं करेगा। सिर के ऊपर से, ऐसे मामले जो काम नहीं करेंगे, पूरी संख्याओं के मिश्रण हैं; नकारात्मक संख्या, अग्रणी शून्य के साथ संख्या, भिन्न के साथ संख्या और शब्द और संख्या संयुक्त।
वंडरवर्कर

3
किसी भी कास्टिंग और बाजीगरी प्रकार के बिना महान समाधान, +1
मक्सिम लुज़िक

पहली नजर में काम नहीं लगता था, लेकिन यह काम कर गया! धन्यवाद!
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

क्या आप व्यख्या कर सकते हैं?
स्लाविक

सबसे सरल उत्तर, जो वास्तव में आवश्यक है, स्ट्रिंग को एक इंट में डाल देता है, फिर उस इंट द्वारा आरोही क्रम में, कोई फंकी सामान नहीं है :)
denford mutseriwa

4

परिवर्तित करने का दूसरा तरीका।

यदि आपके पास स्ट्रिंग फ़ील्ड है, तो आप इसे या इसके संख्यात्मक भाग को निम्न तरीके से बदल सकते हैं: सभी पूर्णांक तार को समान लंबाई बनाने के लिए अग्रणी शून्य जोड़ें।

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

या किसी क्षेत्र के भाग के द्वारा ऑर्डर करें जैसे 'टेंसिमबोलस 13', 'टेंसिमबोलस 1222' आदि।

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

यदि आप AdonisJS का उपयोग कर रहे हैं और आपके पास ABC-202, ABC-201 ... जैसे मिश्रित आईडी हैं, तो आप क्वेरी बिल्डर के साथ कच्चे प्रश्नों को जोड़ सकते हैं और ऊपर दिए गए समाधान को लागू कर सकते हैं ( https://stackoverflow.com/a/25061144/4040735 ) निम्नलिखित नुसार:

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' सबस्टेशन पर एक गणितीय ऑपरेशन करता है जो एक नंबर के लिए प्रभावी ढंग से सबस्ट्रिंग कास्ट करता है।

Ref 1: आप यहां कच्चे प्रश्नों में पैरामीटर बाइंडिंग के बारे में अधिक पढ़ सकते हैं: https://knexjs.org/#Raw-Bindings Ref 2: Adonis Raw Queries: https://adonisjs.com/docs/4.1/query/builder# _raw_queries


-3

VARCHAR के बजाय INT होने के लिए अपने क्षेत्र को बदल दें।

मैं उन्हें कुछ अन्य परिस्थितियों के आधार पर INT नहीं बना सकता।

फिर पहले पर निर्भर परिस्थितियों को ठीक करें। अन्यथा आप वास्तविक अंतर्निहित मुद्दे के आसपास काम कर रहे हैं। MySQL CAST का उपयोग करना एक विकल्प है, लेकिन यह आपके खराब स्कीमा को मास्क कर रहा है जिसे ठीक किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.