মাইএসকিউএল কোয়েরিতে কোনও মান একটি নম্বর কিনা তা সনাক্ত করার কোনও উপায় আছে? যেমন
SELECT *
FROM myTable
WHERE isANumber(col1) = true
মাইএসকিউএল কোয়েরিতে কোনও মান একটি নম্বর কিনা তা সনাক্ত করার কোনও উপায় আছে? যেমন
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]+$';
তথ্যসূত্র: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
এবং যে ক্ষেত্রে আপনার দশমিক বিন্দু থাকতে পারে তার জন্য রিজেক্স ব্যবহার করুন:^[0-9\.]+$
যদি আপনার ডেটা 'পরীক্ষা', 'টেস্ট0', 'টেস্ট 1111', '111 টেস্ট', '111' হয়
সমস্ত রেকর্ড নির্বাচন করতে যেখানে ডেটা একটি সরল আন্ত:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
ফলাফল: '111'
(রেজেক্সে, ^ এর অর্থ শুরু হয় এবং $ এর অর্থ শেষ হয়)
পূর্ণসংখ্যা বা দশমিক সংখ্যা বিদ্যমান যেখানে সমস্ত রেকর্ড নির্বাচন করুন:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
ফলাফল: '১১১' (শেষ উদাহরণের মতো)
অবশেষে, সমস্ত রেকর্ড নির্বাচন করতে যেখানে নম্বর বিদ্যমান, এটি ব্যবহার করুন:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
ফলাফল: 'টেস্ট0' এবং 'টেস্ট 1111' এবং '111 টেস্ট' এবং '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')
- 0 0
select isnumber('38333434')
- ফেরত 1
টেবিলএক্স থেকে ইসনম্বার (মাইকোল) মাইকোল 1, কল 2, কোলক্স নির্বাচন করুন; - কলাম মাইকোল 1 এর জন্য 1 গুলি এবং 0 গুলি ফিরে আসবে
- আপনি দশমিক, বৈজ্ঞানিক স্বরলিপি ইত্যাদি গ্রহণের জন্য ফাংশনটি বাড়িয়ে তুলতে পারেন ...
ইউডিএফ ব্যবহারের সুবিধা হ'ল আপনি এটি আপনার "যেখানে ধারা" তুলনা করে বাম বা ডানদিকে ব্যবহার করতে পারেন। এটি ডাটাবেসে প্রেরণের আগে আপনার এসকিউএলকে ব্যাপকভাবে সরল করে:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
আশাকরি এটা সাহায্য করবে.
আর একটি বিকল্প যা আমার কম্পিউটারে আরজিএক্সপি-র চেয়ে দ্রুত বলে মনে হচ্ছে তা হ'ল
SELECT * FROM myTable WHERE col1*0 != col1;
এটি এমন সমস্ত সারি নির্বাচন করবে যেখানে কল 1 সংখ্যার মান দিয়ে শুরু হয় starts
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'
সত্য
আমি প্রস্তাব দিচ্ছি: আপনার সন্ধানটি যদি সহজ হয় তবে আপনি `ব্যবহার করতে পারেন`
column*1 = column
interesting অপারেটর আকর্ষণীয় :) ক্ষেত্রগুলি বর্ণচর / চরের তুলনায় কাজ এবং দ্রুত
* MyTable থেকে যেখানে নির্বাচন করুন * 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" শূন্য ফিরে আসবে ... সুতরাং এটি কেবলমাত্র পাঠ্যের জন্য কাজ করতে পারে যা সংখ্যা দিয়ে শুরু হয় না।
ভাগ করার চেষ্টা করুন / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table