আমি দেখতে পাচ্ছি যে মাইএসকিউএল এর মধ্যে মানগুলি থেকে পূর্ণসংখ্যা তৈরির জন্য Cast()এবং Convert()কার্যকারিতা রয়েছে তবে মানটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করার কোনও উপায় আছে কি? is_int()পিএইচপি-তে এমন কিছু যা আমি খুঁজছি।
আমি দেখতে পাচ্ছি যে মাইএসকিউএল এর মধ্যে মানগুলি থেকে পূর্ণসংখ্যা তৈরির জন্য Cast()এবং Convert()কার্যকারিতা রয়েছে তবে মানটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করার কোনও উপায় আছে কি? is_int()পিএইচপি-তে এমন কিছু যা আমি খুঁজছি।
উত্তর:
আমি ধরে নেব আপনি একটি স্ট্রিংয়ের মান পরীক্ষা করতে চান। একটি দুর্দান্ত উপায় হ'ল REGEXP অপারেটর, একটি নিয়মিত প্রকাশের সাথে স্ট্রিংয়ের মিল matching সহজভাবে কর
select field from table where field REGEXP '^-?[0-9]+$';
এটি যুক্তিসঙ্গত দ্রুত। যদি আপনার ক্ষেত্রটি সংখ্যাসূচক হয় তবে কেবল তার জন্য পরীক্ষা করুন
ceil(field) = field
পরিবর্তে.
এটি একটি নিয়মিত অভিব্যক্তির বিপরীতে মেলে।
সিএফ http://forums.mysql.com/read.php?60,1907,38488#msg-38488 নীচে উদ্ধৃত:
উত্তর: মাইএসকিউএলে ইসনুমারিক () ধারাটি ??
পোস্ট করেছেন: কেভিনক্লার্ক ()
তারিখ: আগস্ট 08, 2005 01:01 পিএম
আমি রাজী. আমি মাইএসকিউএল 5 এর জন্য তৈরি একটি ফাংশন এখানে রেখেছি:
CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
এটি শুরুতে একটি alচ্ছিক প্লাস / বিয়োগ চিহ্ন, একটি optionচ্ছিক দশমিক বিন্দু এবং বাকী সংখ্যাসূচক সংখ্যাগুলির জন্য অনুমতি দেয়।
ধরুন আমাদের কাছে কলাম রয়েছে বর্ণানুক্রমিক ক্ষেত্রের মতো এন্ট্রি রয়েছে like
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
এবং আপনি এই ডিবি কলাম থেকে সর্বোচ্চ সংখ্যাসূচক মান চান (এই ক্ষেত্রে এটি 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?
কোনও মান মাইকিউএল-তে অন্তর্গত কিনা তা পরীক্ষা করতে আমরা নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারি। এই কোয়েরিটি আন্ত মান সহ সারিগুলি দেবে
SELECT col1 FROM table WHERE concat('',col * 1) = col;
আমি ভেরিয়েবল সম্পর্কে সবচেয়ে ভাল চিন্তা করতে পারি এটি হ'ল মাই এসকিউএল এর ফাংশন CAST()এবং এর সাথে একটি সমন্বয় LENGTH()।
এই পদ্ধতিটি স্ট্রিং, পূর্ণসংখ্যা, ডাবলস / ফ্লোট ডেটাটাইপগুলিতে কাজ করবে।
SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int
ডেমো দেখুন http://sqlfiddle.com/#!9/ff40cd/44
এটি ব্যর্থ হবে যদি কলামটির একক অক্ষরের মান থাকে। যদি কলামটির মান 'এ' থাকে তবে কাস্ট (UNSIGNED হিসাবে 'A') 0 এবং LENGTH (0) হবে 1 হবে so 1 = 1 => 1
সত্যিকারের ওয়াকাস মালিক সেই মামলাটি পরীক্ষা করার জন্য পুরোপুরি fogotten। প্যাচ হয়।
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;এই রিফ্যাক্টরিং উপরের সমস্ত ক্ষেত্রে পরিচালনা করে তবে আমার সামঞ্জস্য -১.০ বা '-১' হ্যান্ডেল করে না। আবার, একটি দুর্দান্ত শীতল সমাধান।
কি সম্পর্কে:
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 'স্ট্রিংয়ের পরীক্ষা হবে returnsTRUE । এটি উপরে ব্যবহৃত নিয়মিত প্রকাশের উপর ভিত্তি করে এমন একটি সংখ্যার মতো দেখাচ্ছে। এই ক্ষেত্রে, যেহেতু 12 স্ট্রিংয়ের শুরুতে রয়েছে, নিয়মিত প্রকাশটি এটি একটি সংখ্যা হিসাবে ব্যাখ্যা করে।
নিম্নলিখিতটি সঠিক মান (অর্থাত্ 0) প্রদান করবে কারণ স্ট্রিংটি সংখ্যাগুলির পরিবর্তে অক্ষর দিয়ে শুরু হয়
SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
উপরেরটি ফিরে আসবে 0 (FALSE ) কারণ স্ট্রিংয়ের শুরুটি পাঠ্য এবং সংখ্যাটি নয়।
তবে, আপনি যদি সংখ্যার সাথে শুরু হওয়া সংখ্যার সাথে অক্ষরের মিশ্রণযুক্ত স্ট্রিংগুলি নিয়ে কাজ করে থাকেন তবে আপনি চান ফলাফল পাবেন না। REGEXP স্ট্রিংটি একটি বৈধ সংখ্যা হিসাবে ব্যাখ্যা করবে যখন বাস্তবে তা নেই।
FALSEপ্রত্যাশার সাথে সাথে প্রত্যাবর্তন করে , কারণ রেইজেক্সটি $স্ট্রিংয়ের সমাপ্তি যার সাথে শেষ হয় , সুতরাং এটি কেবল সংখ্যার জন্য যাচাই করে নিচ্ছেন, যেমনটি লেখকের ইচ্ছা অনুসারে।
এটি ভ্রচারের পক্ষে ভাল কাজ করে যেখানে এটি কোনও সংখ্যার সাথে শুরু হয় বা না ..
WHERE concat('',fieldname * 1) != fieldname
আপনি বৃহত্তর NNNNE + - নাম্বারগুলিতে উঠলে বিধিনিষেধ থাকতে পারে
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;