मैं देखता हूं कि MySQL के भीतर Cast()
और Convert()
मानों से पूर्णांक बनाने के लिए फ़ंक्शन हैं, लेकिन क्या यह देखने का कोई तरीका है कि क्या मान पूर्णांक है? is_int()
PHP में कुछ ऐसा है जिसे मैं खोज रहा हूँ।
मैं देखता हूं कि MySQL के भीतर Cast()
और Convert()
मानों से पूर्णांक बनाने के लिए फ़ंक्शन हैं, लेकिन क्या यह देखने का कोई तरीका है कि क्या मान पूर्णांक है? is_int()
PHP में कुछ ऐसा है जिसे मैं खोज रहा हूँ।
जवाबों:
मैं मानूंगा कि आप एक स्ट्रिंग मान की जांच करना चाहते हैं। एक अच्छा तरीका REGEXP ऑपरेटर है, स्ट्रिंग को नियमित अभिव्यक्ति से मेल खाता है। बस करो
select field from table where field REGEXP '^-?[0-9]+$';
यह काफी तेजी से है। यदि आपका क्षेत्र संख्यात्मक है, तो बस परीक्षण करें
ceil(field) = field
बजाय।
इसे एक नियमित अभिव्यक्ति के खिलाफ मिलाएं।
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]+)$';
यह शुरुआत में एक वैकल्पिक प्लस / माइनस साइन, एक वैकल्पिक दशमलव बिंदु और बाकी संख्यात्मक अंकों की अनुमति देता है।
मान लीजिए कि हमारे पास अल्फ़ान्यूमेरिक फ़ील्ड के साथ कॉलम हैं, जिनमें प्रविष्टियाँ हैं
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
और आप इस db कॉलम से उच्चतम संख्यात्मक मान चाहते हैं (इस मामले में यह 9582 है) तो यह क्वेरी आपकी मदद करेगी
SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
यह भी काम करता है:
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
SELECT CAST('12a34' AS UNSIGNED)
, कौन सा रिटर्न 12
?
यह जांचने के लिए कि क्या मैसुकल में कोई मान है, हम निम्नलिखित क्वेरी का उपयोग कर सकते हैं। यह क्वेरी Int मान के साथ पंक्तियाँ देगा
SELECT col1 FROM table WHERE concat('',col * 1) = col;
सबसे अच्छा मैं एक चर के बारे में सोच सकता है एक 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 |
डेमो देखें
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' को हैंडल नहीं करता है। फिर से, एक सुपर शांत समाधान।
व्हाट अबाउट:
WHERE table.field = "0" or CAST(table.field as SIGNED) != 0
संख्यात्मक और कोरोलरी के लिए परीक्षण करने के लिए:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
मैंने ऊपर सूचीबद्ध नियमित अभिव्यक्तियों का उपयोग करने की कोशिश की है, लेकिन वे निम्नलिखित के लिए काम नहीं करते हैं:
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 स्ट्रिंग की एक मान्य संख्या के रूप में व्याख्या करेगा जब वास्तव में यह नहीं है।
FALSE
उम्मीद के मुताबिक लौटता है, क्योंकि रेग्ज समाप्त होता है, $
जिसका अर्थ है स्ट्रिंग का अंत, इसलिए यह केवल संख्याओं के लिए जाँच कर रहा है, जैसा कि लेखक द्वारा इरादा है।
VARCHAR के लिए यह अच्छी तरह से काम करता है जहां यह एक नंबर से शुरू होता है या नहीं ..
WHERE concat('',fieldname * 1) != fieldname
जब आप बड़े NNNNE + - नंबर पर पाबंदी लगा सकते हैं
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;