मैं यह देखने के लिए कैसे जांच करूं कि क्या मान MySQL में पूर्णांक है?


123

मैं देखता हूं कि MySQL के भीतर Cast()और Convert()मानों से पूर्णांक बनाने के लिए फ़ंक्शन हैं, लेकिन क्या यह देखने का कोई तरीका है कि क्या मान पूर्णांक है? is_int()PHP में कुछ ऐसा है जिसे मैं खोज रहा हूँ।


2
तो दुर्भाग्य से हम MySQL में is_int () फ़ंक्शन बनाना होगा
Yuda Prawira

जवाबों:


214

मैं मानूंगा कि आप एक स्ट्रिंग मान की जांच करना चाहते हैं। एक अच्छा तरीका REGEXP ऑपरेटर है, स्ट्रिंग को नियमित अभिव्यक्ति से मेल खाता है। बस करो

select field from table where field REGEXP '^-?[0-9]+$';

यह काफी तेजी से है। यदि आपका क्षेत्र संख्यात्मक है, तो बस परीक्षण करें

ceil(field) = field

बजाय।


4
'Ceil (फ़ील्ड) = फ़ील्ड' परीक्षण एक अच्छा विचार है, लेकिन @Jumpy ने बताया कि यह गैर-संख्यात्मक डेटा पर विफल है: SELECT छत ('चार') = 'चार'; -> 1
मैथ्यू कॉर्नेल

3
@MatthewCornell, उन्होंने कहा कि यदि आपका क्षेत्र संख्यात्मक है। यदि आप एक नंबर पूर्णांक है तो परीक्षण कर सकते हैं। यह तार पर काम नहीं करेगा, यही कारण है कि पहला विकल्प है।
मालफिस्ट

यदि डेटा में व्हॉट्सएप शामिल हो सकता है, तो यह विफल हो जाएगा। परीक्षण ट्रिम (क्षेत्र) पर विचार करें, संभवतः नए सिरे को हटाने के लिए अतिरिक्त अर्ग के साथ।
माइकल ग्राज़ेब्रुक

डेटा संख्यात्मक है, यह भी कर सकते हैं: चुनें ((क्षेत्र% 1) = 0);
थियामटेक

धन्यवाद, लेकिन संख्यात्मक तुलना के लिए, मुझे लगता है कि आपको जरूरत नहीं है (strcmp (छत (क्षेत्र), क्षेत्र)))
एलन डिक्सन

14

इसे एक नियमित अभिव्यक्ति के खिलाफ मिलाएं।

cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 नीचे उद्धृत रूप में:

पुन :: IsNumeric () MySQL में खंड ??
द्वारा पोस्ट किया गया: kevinclark ()
दिनांक: ० 2005 अगस्त, २००५ दोपहर ०१:०० बजे


मैं सहमत हूँ। यहाँ एक समारोह है जो मैंने MySQL 5 के लिए बनाया है:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';


यह शुरुआत में एक वैकल्पिक प्लस / माइनस साइन, एक वैकल्पिक दशमलव बिंदु और बाकी संख्यात्मक अंकों की अनुमति देता है।


धन्यवाद, आपका समाधान दशमलव का भी ध्यान रखता है
आनंद

12

मान लीजिए कि हमारे पास अल्फ़ान्यूमेरिक फ़ील्ड के साथ कॉलम हैं, जिनमें प्रविष्टियाँ हैं

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84

और आप इस db कॉलम से उच्चतम संख्यात्मक मान चाहते हैं (इस मामले में यह 9582 है) तो यह क्वेरी आपकी मदद करेगी

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'

1
'10000' अधिक है, लेकिन आपकी क्वेरी अभी भी '9582' लौटेगी ।
पॉल स्पीगल

8

यह डेटा प्रकार varchar है यह मानने के लिए यहाँ सरल समाधान है

select * from calender where year > 0

यदि वर्ष सांख्यिक है और असत्य है तो यह सही होगा


29
यदि कोई वर्ण संख्यात्मक है, तो एक varchar में, यह भी सही लौटेगा।
TuK

उस पर ध्यान नहीं दिया। अप-वोटिंग अपनी टिप्पणी :)
जयजीतराज

8

यह भी काम करता है:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.

उदाहरण के लिए

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0

11
किस बारे में SELECT CAST('12a34' AS UNSIGNED), कौन सा रिटर्न 12?
माइक सी

1
यह सही काम करता है यदि आपको गैर-संख्यात्मक वस्तुओं के लिए परीक्षण करने की आवश्यकता है, तो यह अधिक + 1s के योग्य है। गैर-संख्यात्मक वस्तुओं को खोजने के लिए परीक्षण को उलटने के लिए अन्य उत्तर कठिन हैं।
DrCord

1
@DrCord इस मामले के लिए काम नहीं करता है, जो माइक सी द्वारा वर्णित है, इसलिए बहुत अविश्वसनीय है
jontro

4

यह जांचने के लिए कि क्या मैसुकल में कोई मान है, हम निम्नलिखित क्वेरी का उपयोग कर सकते हैं। यह क्वेरी Int मान के साथ पंक्तियाँ देगा

SELECT col1 FROM table WHERE concat('',col * 1) = col;

यह गैर-पूर्णांक संख्या (जैसे। '3.5' ) का भी चयन करेगा ।
पॉल स्पीगल

4

सबसे अच्छा मैं एक चर के बारे में सोच सकता है एक int है MySQL के कार्यों के साथ एक संयोजन है CAST()और LENGTH()
यह विधि स्ट्रिंग्स, पूर्णांक, डबल्स / फ़्लोट डेटेट पर काम करेगी।

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

डेमो देखें http://sqlfiddle.com/#! -9 / ff40cd /44

यदि स्तंभ का एकल वर्ण मान है तो यह विफल हो जाएगा। यदि कॉलम में 'A' का मान है तो Cast ('A' को UNSIGNED के रूप में मूल्यांकन किया जाएगा) और LENGTH (0) का मूल्य 1. होगा। इसलिए LENGTH (कास्ट ('A' को UNSIGNED के रूप में) = LENGTH (0) का मूल्यांकन करेगा 1 = 1 => 1

ट्रू वकास मलिक उस केस को परखने के लिए पूरी तरह से तैयार हो गया। पैच है

SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;

परिणाम

**Query #1**

    SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #2**

    SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #3**

    SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #4**

    SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #5**

    SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;

| 1a  | is_int |
| --- | ------ |
| 1a  | 0      |

---
**Query #6**

    SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;

| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0      |

---
**Query #7**

    SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;

| a1  | is_int |
| --- | ------ |
| a1  | 0      |

---
**Query #8**

    SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;

| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0      |

---
**Query #9**

    SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;

| a   | is_int |
| --- | ------ |
| a   | 0      |

डेमो देखें


यदि स्तंभ का एकल वर्ण मान है तो यह विफल हो जाएगा। यदि कॉलम में 'A' का मान है तो Cast ('A' को UNSIGNED के रूप में मूल्यांकन किया जाएगा) और LENGTH (0) का होगा 1. इसलिए LENGTH (कास्ट ('A' को UNSIGNED के रूप में) = LENGTH (0) का मूल्यांकन करेगा 1 = 1 => 1
वकास मलिक

टिप्पणी के लिए धन्यवाद कि मामला वास्तव में अप्राप्य था @aqasMalik अभी काम कर रहा है और परीक्षण कर रहा है .. कुछ इस तरह हैSELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;
रेमंड निजलैंड

यह एक ऐसा ठंडा उपाय है। मुझे लगता है कि यह नकारात्मक पूर्णांक के लिए विफल रहता है, क्या हस्ताक्षरित पूर्णांकों के लिए अपने समाधान को बदलने के लिए यह कुछ (मूल मामलों में) बदल देता है? मैं बेस के रूप में आपके फिडेल का उपयोग करके परीक्षण कर रहा हूं। set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;यह रीफैक्टरिंग उपरोक्त सभी मामलों को संभालता है, लेकिन यहां तक ​​कि मेरा समायोजन -1.0 या '-1' को हैंडल नहीं करता है। फिर से, एक सुपर शांत समाधान।
spen.smith

3

व्हाट अबाउट:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0

संख्यात्मक और कोरोलरी के लिए परीक्षण करने के लिए:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0

1
CAST (टेबल.फ़ील्ड)! = 0 काम नहीं करेगा क्योंकि इसे डालने के लिए एक प्रकार की आवश्यकता होती है।
रियाद

यह सही काम करता है यदि आपको गैर-संख्यात्मक वस्तुओं के लिए परीक्षण करने की आवश्यकता है, तो यह अधिक + 1s के योग्य है। गैर-संख्यात्मक वस्तुओं को खोजने के लिए परीक्षण को उलटने के लिए अन्य उत्तर कठिन हैं।
DrCord

यह "0000", "0" (स्थान) और "7x" (जिसे एक संख्या माना जाता है) जैसी संख्याओं के लिए काम नहीं करता है।
माइकल ग्राज़ेब्रुक

@MichaelGrazebrook मुझे लगता है कि आप पहले दो मामलों के लिए एक regexp कर सकते हैं। "7x" को एक संख्या माना जाता है? "Ix7" एक संख्या है, लेकिन 7x है?
अगस्त को टॉम ऑगर

1
@Tom बरमा: एक और जवाब ने रेगेक्स प्रकार के समाधानों को कवर किया। "7x को एक संख्या माना जाता है" से मेरा तात्पर्य यह है कि यह कथन सत्य है: 7 = '7q' का चयन करें
माइकल ग्राज़ेब्रुक

1

मैंने ऊपर सूचीबद्ध नियमित अभिव्यक्तियों का उपयोग करने की कोशिश की है, लेकिन वे निम्नलिखित के लिए काम नहीं करते हैं:

SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

उपरोक्त वापस आ जाएगा 1( TRUE), जिसका अर्थ है उपरोक्त स्ट्रिंग '12 INCHES 'का परीक्षण, नियमित अभिव्यक्ति के विरुद्ध, रिटर्न TRUE। यह ऊपर प्रयुक्त नियमित अभिव्यक्ति के आधार पर एक संख्या जैसा दिखता है। इस मामले में, क्योंकि 12 स्ट्रिंग की शुरुआत में है, नियमित अभिव्यक्ति इसे संख्या के रूप में व्याख्या करता है।

निम्नलिखित सही मान लौटाएगा (यानी 0) क्योंकि स्ट्रिंग अंकों के बजाय वर्णों से शुरू होती है

SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

उपरोक्त वापस आ जाएगा 0( FALSE) क्योंकि स्ट्रिंग की शुरुआत पाठ है और संख्यात्मक नहीं है।

हालाँकि, यदि आप ऐसे स्ट्रिंग्स के साथ काम कर रहे हैं जिनमें संख्याओं और अक्षरों का मिश्रण है जो एक नंबर से शुरू होते हैं, तो आपको वे परिणाम नहीं मिलेंगे जो आप चाहते हैं। REGEXP स्ट्रिंग की एक मान्य संख्या के रूप में व्याख्या करेगा जब वास्तव में यह नहीं है।


2
यह गलत है। क्या आपने इसका परीक्षण किया? जब मैं आपका पहला उदाहरण चलाता हूं, तो यह FALSEउम्मीद के मुताबिक लौटता है, क्योंकि रेग्ज समाप्त होता है, $जिसका अर्थ है स्ट्रिंग का अंत, इसलिए यह केवल संख्याओं के लिए जाँच कर रहा है, जैसा कि लेखक द्वारा इरादा है।
spikyjt

1

VARCHAR के लिए यह अच्छी तरह से काम करता है जहां यह एक नंबर से शुरू होता है या नहीं ..

WHERE concat('',fieldname * 1) != fieldname 

जब आप बड़े NNNNE + - नंबर पर पाबंदी लगा सकते हैं


यह एक चार तार के लिए काम नहीं लगता हैset @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
spen.smith

0

मेरे लिए केवल एक चीज है जो काम करती है:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

केविनक्लार्क से 234jk456या मेरे मामले में मेरे लिए अन्य सभी बेकार सामान लौटाते हैं12 inches

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