पता लगाएँ कि क्या मान MySQL में संख्या है


159

क्या यह पता लगाने का एक तरीका है कि क्या कोई मूल्य MySQL क्वेरी में एक संख्या है? जैसे कि

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

मैंने 1 * col = col की रणनीति का परीक्षण किया है, लेकिन किसी तरह यह विफल हो जाता है जब क्वेरी को PHP के माध्यम से कॉल किया जाता है (जब यह सही नहीं होता है)। PhpMyAdmin में, हालांकि हैक काम करता है। इसका मतलब यह है कि मेरा परीक्षण उम्मीद के मुताबिक व्यवहार करता है, मेरे आवेदन को नहीं खरीदता है।
यहजीएल

जवाबों:


250

यह ज्यादातर मामलों में काम करना चाहिए।

SELECT * FROM myTable WHERE concat('',col1 * 1) = col1

यह गैर-मानक संख्याओं की तरह काम नहीं करता है

  • 1e4
  • 1.2e5
  • 123. (अनुगामी दशमलव)

धन्यवाद। दुर्भाग्य से मुझे यह पहचानने की आवश्यकता है कि 123 एक संख्या है, लेकिन 123X नहीं है।
उरबिकोज़

1
@ रिचर्ड- मैंने अभी आपके द्वारा दिए गए अपवादों को पढ़ा। सोचा था कि आप चरित्र "ई" का मतलब है। मैं देख सकता हूं कि तुम्हरा अब क्या मतलब है।
उरबिकोज़

लीडिंग जीरो एक डीफ़ल एसक्यूएल डेवलपर के लिए कोई मुद्दा नहीं है --- ट्रिम (
कॉल

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन मैं अपनी क्वेरी में इस पद्धति का उपयोग करता हूं। लेकिन मुझे एक समस्या है, यह "2-पॉवर" को "2" के रूप में पहचानता है, जिससे परेशानी होती है क्योंकि ऐसा नहीं करना चाहिए। कोई उपाय ?
जीरोसे

1
ट्रेलिंग और अग्रणी शून्य के लिए (उदा। 023.12000): कॉनैट ('', कॉल 1 * 1) = '0' या कॉन्कैट ('', कॉल 1 * 1) = आईएफ (LOCATE ('।'), कॉल 1, टीआरआईएम (बीओटीएच)। 0 'FROM col1), TRIM (अग्रणी' 0 'FROM col1));
फ्रांस्वा ब्रेटन

299

आप रेगुलर एक्सप्रेशन का भी उपयोग कर सकते हैं ... यह इस तरह होगा:

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';

संदर्भ: http://dev.mysql.com/doc/refman/5.1/en/regexp.html


70
सेलेक्ट करें * MyTable WHERE col1 REGEXP '^ [0-9] + $' से;
दिमित्री कोज़मेनको

7
स्वीकृत उत्तर वास्तव में चतुर है, लेकिन यह उत्तर अधिक प्रत्यक्ष है, और मुझे लगता है कि यह स्वीकृत समाधान होना चाहिए।
पेड्रोमानोएल

21
"मेल नहीं खाता" WHERE col1 NOT REGEXP...के मामले के लिए : और उस मामले के लिए जहां आपके पास दशमलव बिंदु हो सकता है, रेगेक्स का उपयोग करें:^[0-9\.]+$
रोबी एवरिल

2
इसके अलावा वैज्ञानिक संकेतन के लिए काम नहीं करेंगे, केवल चींटियों के लिए काम करता है
डेविड विल्किंस

1
रेगेक्स माइग्रेट उन लोगों के लिए पढ़ना मुश्किल है, जिन्होंने कभी इसका इस्तेमाल नहीं किया, लेकिन आप इसके साथ वास्तव में महान और छोटी चीजें कर सकते हैं
ओली

56

यदि आपका डेटा 'परीक्षण', 'test0', 'test1111', '111test', '111' है

उन सभी रिकॉर्डों का चयन करने के लिए जहां डेटा एक सरल int है:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+$';

परिणाम: '111'

(रेगेक्स में, ^ का अर्थ है शुरू, और $ का मतलब अंत)

उन सभी रिकॉर्डों का चयन करने के लिए जहां एक पूर्णांक या दशमलव संख्या मौजूद है:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12

परिणाम: '111' (पिछले उदाहरण के समान)

अंत में, सभी रिकॉर्ड का चयन करने के लिए जहां नंबर मौजूद है, इसका उपयोग करें:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '[0-9]+';

परिणाम: 'test0' और 'test1111' और '111test' और '111'


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

8
नकारात्मक मूल्यों के लिए काम नहीं कर रहा है। मैं प्रस्तावित regexp में निम्नानुसार संशोधन करूंगा:REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
निकोलस

मैं कहता हूं कि "+" प्रतीक आवश्यक नहीं है, आप बस "-" का उपयोग कर सकते हैं, लेकिन यदि आप इसका उपयोग करना चाहते हैं, तो आपको इसे बचाना चाहिए (और "-" प्रतीक से बचने की आवश्यकता नहीं है) ।
टी। कॉर्नर

13
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'

भी हस्ताक्षरित दशमलव (जैसे -1.2, +0.2, 6., 2e9, 1.2e-10 ) से मेल खाएगा

परीक्षा:

drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1) 
  values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');

select 
  col1,
  col1 + 0 as casted,
  col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;

परिणाम:

col1   |  casted | isNumeric
-------|---------|----------
00.00  |       0 |         1
+1     |       1 |         1
.123   |   0.123 |         1
-.23e4 |   -2300 |         1
12.e-5 | 0.00012 |         1
3.5e+6 | 3500000 |         1
a      |       0 |         0
e6     |       0 |         0
+e0    |       0 |         0

डेमो


3
उत्तम! केवल उत्तर दें कि वास्तव में सभी आधारों को शामिल किया गया है। स्वीकृत उत्तर होना चाहिए।
डोम

10

संख्यात्मक पंक्तियाँ देता है

मुझे निम्नलिखित क्वेरी के साथ समाधान मिला और मेरे लिए काम करता है:

SELECT * FROM myTable WHERE col1 > 0;

इस क्वेरी रिटर्न पंक्तियों में केवल शून्य से अधिक कॉलम हैं col1

गैर-संख्यात्मक पंक्तियाँ लौटाता है

अगर आप कॉलम को चेक करना चाहते हैं तो संख्यात्मक नहीं इस ट्रिक के साथ प्रयास करें ( !col1 > 0):

SELECT * FROM myTable WHERE !col1 > 0;

यह काम नहीं करता है, यदि आपके पास एक स्ट्रिंग है जो एक संख्या "123abc" से शुरू होती है, तो यह आपके सांख्यिक पंक्तियों के विवरण में लौटा दी जाएगी और गैर-संख्यात्मक कथन में नहीं।
जस्तेपन

@JStephen तुम सही हो! क्योंकि SELECT * FROM myTable WHERE col1 = 123;क्वेरी पंक्तियों को भी वापस लौटा देगी123abc
बोरा

9

यह उत्तर दिमित्री के समान है, लेकिन यह दशमलव के साथ-साथ सकारात्मक और नकारात्मक संख्या की अनुमति देगा।

select * from table where col1 REGEXP '^[[:digit:]]+$'

8

एक यूडीएफ (उपयोगकर्ता परिभाषित फ़ंक्शन) का उपयोग करें।

CREATE FUNCTION isnumber(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;

फिर जब आप प्रश्न करते हैं

select isnumber('383XXXX') 

- व्रत ०

select isnumber('38333434') 

- १

तालिका से xn2 का चयन करें (mycol) mycol1, col2, colx; - कॉलम mycol1 के लिए 1s और 0s वापस करेंगे

- आप decimals, वैज्ञानिक संकेतन, आदि लेने के लिए फ़ंक्शन को बढ़ा सकते हैं ...

यूडीएफ का उपयोग करने का लाभ यह है कि आप इसे अपने "जहां क्लॉज" की तुलना में बाईं या दाईं ओर उपयोग कर सकते हैं। डेटाबेस में भेजे जाने से पहले यह आपकी SQL को सरल करता है:

 SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');

उम्मीद है की यह मदद करेगा।


5

एक और विकल्प जो मेरे कंप्यूटर पर REGEXP से तेज लगता है

SELECT * FROM myTable WHERE col1*0 != col1;

यह उन सभी पंक्तियों का चयन करेगा, जहाँ col1 एक संख्यात्मक मान से शुरू होता है।


2
यदि मूल्य शून्य है तो क्या होगा?
उरबीकोज़

1
मुझे लगता है कि आप AND col1<>0उस अपवाद को संभालने के लिए जोड़ सकते हैं।
उरबिकोज़

यह सच है कि यह शून्य मानों के लिए काम नहीं करता है, लेकिन यह पूरी तरह से गद्देदार संख्याओं के लिए काम करता है, उदाहरण के लिए 004. स्वीकृत उत्तर गद्देदार संख्याओं के लिए काम नहीं करता है
अब्बास

मुझे लगता है कि संख्याओं की जांच करने का यह सबसे अच्छा तरीका है। यह सिर्फ इतना है कि हमें शून्य की जाँच के लिए एक OR स्टेटमेंट जोड़ना होगा, जैसे कि * MyTable WHERE col1 * 0 से चयन करें! = Col1 OR col1 = '0';
बीनू रमन

मैं एक गलत सकारात्मक के लिए मिलता है '1a'। BTW: यह बराबर है WHERE col1 <> 0- rextester.com/DJIS1493
पॉल स्पीगेल

4

अभी भी इस सरल संस्करण को याद नहीं कर रहा है:

SELECT * FROM myTable WHERE `col1` + 0 = `col1`

(इसके अलावा गुणा के रूप में तेज होना चाहिए)

या आगे खेलने के लिए सबसे धीमा संस्करण:

SELECT *, 
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` 
FROM `myTable`
HAVING `IS_NUMERIC` = 1

3
जब तक मुझे गलतफहमी न हो, MySQL किसी भी स्ट्रिंग को 0 में परिवर्तित करता है, इसलिए यह स्ट्रिंग्स और संख्याओं के बीच अंतर नहीं करेगा, दोनों एक ही वापस आएंगे।
इवान मैक

3
'a' + 0 = 'a'TRUE है
पॉल स्पीगेल

3

मेरा सुझाव है: यदि आपकी खोज सरल है, तो आप `का उपयोग कर सकते हैं

column*1 = column

`ऑपरेटर दिलचस्प :) खेतों की चरखी / चर की तुलना में काम और तेज है

चयन करें * MyTable WHERE कॉलम से * 1 = कॉलम;

ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)

1
क्या आप जानते हैं कि MySQL में दोनों सही हैं select 'aaa123' >= 0और select '123aaa' >= 0वापस लौटते हैं?
ग्रेज़गोरज़ स्मुल्को

1
SELECT * FROM myTable WHERE sign (col1)!=0

संकेत चिह्न (0) शून्य है, लेकिन तब आप क्वेरी को प्रतिबंधित कर सकते हैं ...

SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0

अद्यतन: यह 100% विश्वसनीय नहीं है, क्योंकि "1abc" 1 का संकेत लौटाएगा, लेकिन "ab1c" शून्य वापस आएगा ... इसलिए यह केवल पाठ के लिए काम कर सकता है जो संख्याओं से शुरू नहीं होता है।


0

आप का उपयोग कर सकते हैं CAST

  SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")

0

मैंने पाया है कि यह काफी अच्छा काम करता है

if(col1/col1= 1,'number',col1) AS myInfo

यह उसी तरह है जैसे कि जाँचने के लिए col1 <> 0और झूठे सकारात्मक के लिए देता है 1a- rextester.com/HLORBZ1242
पॉल

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