पाठ को MySQL क्वेरी में संख्या में परिवर्तित करें


138

क्या MySQL क्वेरी के भीतर पाठ को संख्या में बदलना संभव है? मेरे पास एक पहचानकर्ता वाला एक कॉलम है जिसमें "नाम-संख्या" के प्रारूप में एक नाम और एक संख्या है। कॉलम में VARCHAR प्रकार है। मैं संख्या के अनुसार पंक्तियों को क्रमबद्ध करना चाहता हूँ (समान नाम वाली पंक्तियाँ) लेकिन कॉलम को वर्ण क्रम के अनुसार क्रमबद्ध किया जाता है, अर्थात

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

यदि मैं संख्या में कटौती करता हूं, तो क्या मैं 'varchar' संख्या को 'वास्तविक' संख्या में परिवर्तित कर सकता हूं और पंक्तियों को क्रमबद्ध करने के लिए इसका उपयोग कर सकता हूं? मैं निम्नलिखित आदेश प्राप्त करना चाहूंगा।

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

मैं एक अलग कॉलम के रूप में संख्या का प्रतिनिधित्व नहीं कर सकता।

संपादित 2011-05-11 9:32

मैंने निम्नलिखित समाधान पाया है ... ORDER BY column * 1। यदि नाम में कोई संख्या नहीं होगी तो क्या वह उस समाधान का उपयोग करने के लिए बचा है?


1
नाम बिल्कुल नाम है या यह कोई भी चरित्र हो सकता है? मेरा मतलब है: यह एक स्ट्रिंग चार वर्ण लंबा है या एक वास्तविक नाम है?
मार्को

nameअक्षरों का कोई भी क्रम हो सकता है।
czuk

जवाबों:


256

यह काम करना चाहिए:

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

1
क्या आप एक स्पष्टीकरण और प्रलेखन के लिए एक कड़ी जोड़ सकते हैं?
एंजेलो फुच्स

मेरी स्ट्रिंग "नाम-एबीसी 12" जैसी है। अपना कोड जोड़कर, यह केवल तभी काम करता है जब प्रारंभिक वर्ण "-" अक्षर से शुरू न हों। @ मार्को क्या आप मुझे बिना किसी शर्त के अक्षरों को अनदेखा करने का एक तरीका बता सकते हैं?
एडुआर्डो

1
@Eduardo मेरी क्वेरी "-" के बाद स्ट्रिंग प्राप्त करने वाली है और इसे एक नंबर में परिवर्तित करना है (यह एक नंबर होना चाहिए)। आपके मामले में मैं शायद एक नियमित अभिव्यक्ति का उपयोग करूँगा ...
मार्को

@ मार्को नियमित अभिव्यक्ति ने किया, टिप के लिए धन्यवाद।
एडुआर्डो

32

आप उपयोग कर सकते हैं SUBSTRINGऔर CONVERT:

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

name_column"नाम-" मानों के साथ कॉलम कहां है। SUBSTRINGछठे वर्ण से पहले हटा देगा सब कुछ (यानी "नाम-" उपसर्ग) और फिर CONVERTधर्मान्तरित कोई वास्तविक पूर्णांक तक बची हैं।

अद्यतन : टिप्पणियों में बदलती परिस्थितियों (यानी उपसर्ग कुछ भी हो सकता है) को देखते हुए, आपको LOCATEमिक्स में फेंकना होगा :

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

यह निश्चित रूप से मानता है कि गैर-सांख्यिक उपसर्ग का इसमें कोई हाइफ़न नहीं है, लेकिन संबंधित टिप्पणी यह ​​कहती है कि:

name अक्षरों का कोई भी क्रम हो सकता है

ताकि एक सुरक्षित धारणा हो।


मेरी टिप्पणी का उत्तर देते हुए, उन्होंने हमें बताया कि नाम किसी भी वर्ण का हो सकता है, इसलिए मुझे यकीन नहीं है कि आप उपयोग कर सकते हैं SUBSTRING(name_column, 6)। मुझे पता है, आपने इसे तब पोस्ट किया जब उसने हमें यह नहीं बताया ...
मार्को

@ मार्को: सिर के लिए धन्यवाद, मैंने एक अपडेट जोड़ा जो उपसर्गों के बारे में नई जानकारी का ध्यान रखना चाहिए। लेकिन हाँ, आपका SUBSTRING_INDEX अच्छा है।
म्यू बहुत कम है

23

बस कास्ट का उपयोग करें,

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
क्या आप सुनिश्चित हैं कि ORDER BY CONVERT का उपयोग किए बिना संख्या के रूप में संख्या का उपयोग करता है? मुझे यकीन नहीं है, लेकिन यह हो सकता है .. मैं सिर्फ खुद से पूछ रहा हूं :)
मार्को

4

एक सरल तरीका '123' + 0 का चयन करें


यद्यपि यह कोड समस्या को हल करने में मदद कर सकता है, क्यों और / या कैसे का उत्तर देने के संबंध में अतिरिक्त संदर्भ प्रदान करता है, इससे इसके दीर्घकालिक मूल्य में काफी सुधार होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें।
टोबे स्पाइट

यह सवाल का जवाब नहीं था लेकिन यह वह जवाब था जिसकी मुझे तलाश थी।
सागर शाह

आपका समाधान सबसे सुरुचिपूर्ण और व्यावहारिक है - दुर्भाग्य से आपने इसे दिए गए उदाहरण के लिए विशिष्ट अभिव्यक्ति के साथ प्रश्न के संदर्भ में प्रदान नहीं किया है - कृपया इसे विशिष्ट होने के लिए संशोधित करें।
चुको


2

यदि आपकी प्राथमिक कुंजी

ABC / EFG / EE / 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.