মাইএসকিউএলে কোনও মান একটি পূর্ণসংখ্যা কিনা তা আমি কীভাবে পরীক্ষা করব?


123

আমি দেখতে পাচ্ছি যে মাইএসকিউএল এর মধ্যে মানগুলি থেকে পূর্ণসংখ্যা তৈরির জন্য Cast()এবং Convert()কার্যকারিতা রয়েছে তবে মানটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করার কোনও উপায় আছে কি? is_int()পিএইচপি-তে এমন কিছু যা আমি খুঁজছি।


2
খুব দুঃখের সাথে আমাদের অবশ্যই মাইএসকিএলে is_int () ফাংশন তৈরি করতে হবে
যুদা প্রবীরা

উত্তর:


214

আমি ধরে নেব আপনি একটি স্ট্রিংয়ের মান পরীক্ষা করতে চান। একটি দুর্দান্ত উপায় হ'ল REGEXP অপারেটর, একটি নিয়মিত প্রকাশের সাথে স্ট্রিংয়ের মিল matching সহজভাবে কর

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

এটি যুক্তিসঙ্গত দ্রুত। যদি আপনার ক্ষেত্রটি সংখ্যাসূচক হয় তবে কেবল তার জন্য পরীক্ষা করুন

ceil(field) = field

পরিবর্তে.


4
'সিল (ক্ষেত্র) = ক্ষেত্র' পরীক্ষাটি একটি দুর্দান্ত ধারণা, তবে @ জম্পি উল্লেখ করেছেন যে এটি অ-সংখ্যাসূচক ডেটাতে ব্যর্থ হয়: SELECT ceil ('four') = 'four'; -> 1
ম্যাথু কর্নেল

3
@ ম্যাথেজ কর্নেল, তিনি বলেছেন যদি আপনার ক্ষেত্রটি সংখ্যাসূচক হয়। এটি কোনও সংখ্যাটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করতে পারবেন can এটি স্ট্রিংগুলিতে কাজ করবে না, এজন্য প্রথম বিকল্পটি এখানে।
মলফিস্ট

যদি ডেটাতে হোয়াইটস্পেস অন্তর্ভুক্ত থাকে তবে এটি ব্যর্থ হবে। ট্রিম (ফিল্ড) পরীক্ষার বিষয়টি বিবেচনা করুন, সম্ভবত নতুন লাইনগুলি সরানোর জন্য একটি অতিরিক্ত আরগ দিয়ে।
মাইকেল গ্রেজেব্রুক

ডেটা সংখ্যাগত, এটিও এটি করতে পারে: ((ক্ষেত্র% 1) = 0) নির্বাচন করুন;
থিয়ামটেক

ধন্যবাদ, তবে সংখ্যার তুলনার জন্য, আমি মনে করি আপনার দরকার নেই (স্ট্রিম্প (সিলিং (ফিল্ড), ফিল্ড))
অ্যালান ডিকসন

14

এটি একটি নিয়মিত অভিব্যক্তির বিপরীতে মেলে।

সিএফ 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চ্ছিক দশমিক বিন্দু এবং বাকী সংখ্যাসূচক সংখ্যাগুলির জন্য অনুমতি দেয়।


ধন্যবাদ, আপনার সমাধান দশমিকেরও যত্ন নেয়
আনন্দ

12

ধরুন আমাদের কাছে কলাম রয়েছে বর্ণানুক্রমিক ক্ষেত্রের মতো এন্ট্রি রয়েছে like

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

এবং আপনি এই ডিবি কলাম থেকে সর্বোচ্চ সংখ্যাসূচক মান চান (এই ক্ষেত্রে এটি 9582) তবে এই ক্যোয়ারী আপনাকে সহায়তা করবে

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

1
'10000' উচ্চতর, তবে আপনার ক্যোয়ারীটি এখনও '9582' ফেরত আসবে ।
পল স্পিগেল

8

এটির জন্য ডেটা প্রকারের বর্ণনাকে ধরে নেওয়া সহজ সমাধান

select * from calender where year > 0

বছরটি যদি অন্য সংখ্যাটি মিথ্যা হয় তবে এটি সত্য হবে


29
কোনও ভারচারে, প্রথম অক্ষরটি সংখ্যাসূচক হলে এটি সত্যও ফিরে আসবে।
টুক

তা খেয়াল করেনি। আপনার মন্তব্য আপ-ভোটিং :)
জয়জিৎরাজ

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
আপনার অ-সংখ্যাসূচক আইটেমগুলির পরীক্ষা করার প্রয়োজন হলে এটি নিখুঁত কাজ করে, এটি আরও +1 প্রাপ্য। অন্যান্য উত্তরগুলি অ-সংখ্যাযুক্ত আইটেমগুলি সন্ধানের জন্য পরীক্ষার বিপরীত করা শক্ত।
ড্রকর্ড

1
@ DRCord মাইক সি বর্ণিত মামলার পক্ষে এটি কাজ করে না, তাই খুব অবিশ্বস্ত
jontro

4

কোনও মান মাইকিউএল-তে অন্তর্গত কিনা তা পরীক্ষা করতে আমরা নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারি। এই কোয়েরিটি আন্ত মান সহ সারিগুলি দেবে

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

এটি অ-পূর্ণসংখ্যার সংখ্যাগুলিও নির্বাচন করবে (উদাঃ '3.5' )।
পল স্পিগেল

4

আমি ভেরিয়েবল সম্পর্কে সবচেয়ে ভাল চিন্তা করতে পারি এটি হ'ল মাই এসকিউএল এর ফাংশন 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      |

দেখতে ডেমো


এটি ব্যর্থ হবে যদি কলামটির একটি একক অক্ষরের মান থাকে। যদি কলামটির মান 'এ' থাকে তবে কাস্ট (UNSIGNED হিসাবে 'A') 0 এবং LENGTH (0) হবে 1 হবে so 1 = 1 => 1
ওয়াকাস মালিক

মন্তব্যটি করার জন্য ধন্যবাদ যে কেসটি সত্যই অনাকাঙ্ক্ষিত ছিল @ ওয়াকাসমালিক এই মুহূর্তে একটি প্যাচ কাজ করছে এবং পরীক্ষা করছে .. এরকম কিছু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;এই রিফ্যাক্টরিং উপরের সমস্ত ক্ষেত্রে পরিচালনা করে তবে আমার সামঞ্জস্য -১.০ বা '-১' হ্যান্ডেল করে না। আবার, একটি দুর্দান্ত শীতল সমাধান।
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 কাজ করতে পারে না কারণ castালতে টাইপের প্রয়োজন হয়।
রিয়াদ

আপনার অ-সংখ্যাসূচক আইটেমগুলির পরীক্ষা করার প্রয়োজন হলে এটি নিখুঁত কাজ করে, এটি আরও +1 প্রাপ্য। অন্যান্য উত্তরগুলি অ-সংখ্যাযুক্ত আইটেমগুলি সন্ধানের জন্য পরীক্ষার বিপরীত করা শক্ত।
ড্রকর্ড

এটি "0000", "0" (স্পেস) এবং "7x" (যা একটি সংখ্যা হিসাবে বিবেচিত) এর মতো সংখ্যার জন্য কাজ করে না।
মাইকেল গ্রেজেব্রুক

@ মিশেলগ্র্যাজব্রুক আমি মনে করি আপনি প্রথম দুটি ক্ষেত্রে একটি রেজিএক্সপ্যাক করতে পারেন। "7x" কে একটি সংখ্যা হিসাবে বিবেচনা করা হয়? "0x7" একটি সংখ্যা, তবে 7x?
টম অাগার

1
@ টম অাগার: আর একটি উত্তর রেজেেক্স ধরণের সমাধানকে অন্তর্ভুক্ত করেছে। আমি "7x একটি সংখ্যা হিসাবে বিবেচিত" বলতে যা বোঝাতে চেয়েছি তা হ'ল এই বিবৃতিটি সত্য: 7 = '7 কিউ' নির্বাচন করুন
মাইকেল গ্রজেব্রুক

1

আমি উপরে তালিকাভুক্ত নিয়মিত প্রকাশগুলি ব্যবহার করার চেষ্টা করেছি, তবে সেগুলি নিম্নলিখিতটির জন্য কাজ করে না:

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 স্ট্রিংটি একটি বৈধ সংখ্যা হিসাবে ব্যাখ্যা করবে যখন বাস্তবে তা নেই।


2
এটি ভুল। আপনি এটি পরীক্ষা করেছেন? আমি যখন আপনার প্রথম উদাহরণটি চালনা করি তখন এটি FALSEপ্রত্যাশার সাথে সাথে প্রত্যাবর্তন করে , কারণ রেইজেক্সটি $স্ট্রিংয়ের সমাপ্তি যার সাথে শেষ হয় , সুতরাং এটি কেবল সংখ্যার জন্য যাচাই করে নিচ্ছেন, যেমনটি লেখকের ইচ্ছা অনুসারে।
spikyjt

1

এটি ভ্রচারের পক্ষে ভাল কাজ করে যেখানে এটি কোনও সংখ্যার সাথে শুরু হয় বা না ..

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]+)$';

কেভিনক্লার্ক থেকে আমার জন্য অন্য সমস্ত রিটার্ন বেহুদা জিনিস 234jk456or12 inches

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.