क्या यह पता लगाने का एक तरीका है कि क्या कोई मूल्य MySQL क्वेरी में एक संख्या है? जैसे कि
SELECT *
FROM myTable
WHERE isANumber(col1) = true
क्या यह पता लगाने का एक तरीका है कि क्या कोई मूल्य MySQL क्वेरी में एक संख्या है? जैसे कि
SELECT *
FROM myTable
WHERE isANumber(col1) = true
जवाबों:
यह ज्यादातर मामलों में काम करना चाहिए।
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
यह गैर-मानक संख्याओं की तरह काम नहीं करता है
1e4
1.2e5
123.
(अनुगामी दशमलव)आप रेगुलर एक्सप्रेशन का भी उपयोग कर सकते हैं ... यह इस तरह होगा:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
WHERE col1 NOT REGEXP...
के मामले के लिए : और उस मामले के लिए जहां आपके पास दशमलव बिंदु हो सकता है, रेगेक्स का उपयोग करें:^[0-9\.]+$
यदि आपका डेटा 'परीक्षण', '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'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
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
संख्यात्मक पंक्तियाँ देता है
मुझे निम्नलिखित क्वेरी के साथ समाधान मिला और मेरे लिए काम करता है:
SELECT * FROM myTable WHERE col1 > 0;
इस क्वेरी रिटर्न पंक्तियों में केवल शून्य से अधिक कॉलम हैं col1
गैर-संख्यात्मक पंक्तियाँ लौटाता है
अगर आप कॉलम को चेक करना चाहते हैं तो संख्यात्मक नहीं इस ट्रिक के साथ प्रयास करें ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
क्वेरी पंक्तियों को भी वापस लौटा देगी123abc
एक यूडीएफ (उपयोगकर्ता परिभाषित फ़ंक्शन) का उपयोग करें।
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');
उम्मीद है की यह मदद करेगा।
एक और विकल्प जो मेरे कंप्यूटर पर REGEXP से तेज लगता है
SELECT * FROM myTable WHERE col1*0 != col1;
यह उन सभी पंक्तियों का चयन करेगा, जहाँ col1 एक संख्यात्मक मान से शुरू होता है।
AND col1<>0
उस अपवाद को संभालने के लिए जोड़ सकते हैं।
अभी भी इस सरल संस्करण को याद नहीं कर रहा है:
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
'a' + 0 = 'a'
TRUE है
मेरा सुझाव है: यदि आपकी खोज सरल है, तो आप `का उपयोग कर सकते हैं
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**)
select 'aaa123' >= 0
और select '123aaa' >= 0
वापस लौटते हैं?
SELECT * FROM myTable WHERE sign (col1)!=0
संकेत चिह्न (0) शून्य है, लेकिन तब आप क्वेरी को प्रतिबंधित कर सकते हैं ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
अद्यतन: यह 100% विश्वसनीय नहीं है, क्योंकि "1abc" 1 का संकेत लौटाएगा, लेकिन "ab1c" शून्य वापस आएगा ... इसलिए यह केवल पाठ के लिए काम कर सकता है जो संख्याओं से शुरू नहीं होता है।
मैंने पाया है कि यह काफी अच्छा काम करता है
if(col1/col1= 1,'number',col1) AS myInfo
col1 <> 0
और झूठे सकारात्मक के लिए देता है 1a
- rextester.com/HLORBZ1242
डिवाइडिंग / 1 आज़माएं
select if(value/1>0 or value=0,'its a number', 'its not a number') from table