মাইএসকিউএলে মানটি কিনা তা সনাক্ত করুন


159

মাইএসকিউএল কোয়েরিতে কোনও মান একটি নম্বর কিনা তা সনাক্ত করার কোনও উপায় আছে? যেমন

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

আমি 1 * কল = করল কৌশলটি পরীক্ষা করেছি, তবে পিএইচপি এর মাধ্যমে কোয়েরিটি কল করা হলে এটি কোনওভাবেই ব্যর্থ হয় (কখনই এটি সত্য হওয়া উচিত নয়)। পিএইচপিএমআইএডমিনে তবে হ্যাকটি কাজ করে। এর অর্থ আমার পরীক্ষাটি প্রত্যাশার মতো আচরণ করে, আমার অ্যাপ্লিকেশনটি কিনে না।
জাহাজিল

উত্তর:


250

এটি বেশিরভাগ ক্ষেত্রেই কাজ করা উচিত।

SELECT * FROM myTable WHERE concat('',col1 * 1) = col1

এটি মানহীন সংখ্যাগুলির মতো কাজ করে না

  • 1e4
  • 1.2e5
  • 123. (পিছনে দশমিক)

ধন্যবাদ. দুর্ভাগ্যক্রমে আমার এটি সনাক্ত করা দরকার যে 123 একটি সংখ্যা, তবে 123X নয়।
উরবিকোজ

1
@ রিচার্ড- আপনার দেওয়া ব্যতিক্রমগুলি আমি কেবল পড়েছি। ভেবেছিলেন আপনি "ই" চরিত্রটি বোঝাতে চাইছেন। আমি এখন আপনি কি বলতে চাইছেন।
উরবিকোজ

শীর্ষস্থানীয় জিরোগুলি কোনও বুদ্ধিমান স্কয়ার বিকাশকারী --- ট্রিমের জন্য কোনও সমস্যা নয় (কোল 1 থেকে শীর্ষস্থানীয় 0)
পিমব্রউবার্স

আমি জানি এটি একটি পুরানো পোস্ট তবে আমি আমার ক্যোয়ারিতে এই পদ্ধতিটি ব্যবহার করি। তবে আমার একটি সমস্যা আছে, এটি "2-পাওয়ার "টিকে" 2 "হিসাবে সনাক্ত করে কারণ এটি করার কথা না বলে এটি সমস্যা সৃষ্টি করে। কোন ধারণা ?
গ্রোসাই

1
পিছনে ও শীর্ষস্থানীয় শূন্যগুলির জন্য (উদাঃ 023.12000): কনক্যাট ('', কল 1 * 1) = '0' ওআর কনট্যাট ('', কল 1 * 1) = আইএফ (লোক্যাট ('।', কোল 1), ট্রিম (উভয় ') 0 'FROM কল 1), ট্রিম (নেতৃত্বাধীন' 0 'থেকে কোল 1));
ফ্রান্সোইস ব্রেটন

299

আপনি নিয়মিত এক্সপ্রেশনও ব্যবহার করতে পারেন ... এটির মতো হবে:

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';

তথ্যসূত্র: http://dev.mysql.com/doc/refman/5.1/en/regexp.html


70
MyTable থেকে * নির্বাচন করুন যেখানে কোল 1 REGEXP '^ [0-9] + $';
দিমিত্রি কোজমেনকো

7
গৃহীত উত্তরটি সত্যই চতুর, তবে এই উত্তরটি আরও সরাসরি, এবং আমি মনে করি এটি গ্রহণযোগ্য সমাধান হওয়া উচিত।
পেড্রোম্যানোয়েল

21
"মেলে না" এর ক্ষেত্রে: WHERE col1 NOT REGEXP...এবং যে ক্ষেত্রে আপনার দশমিক বিন্দু থাকতে পারে তার জন্য রিজেক্স ব্যবহার করুন:^[0-9\.]+$
রবি অ্যাভারিল

2
বৈজ্ঞানিক স্বরলিপি জন্য কাজ করবে না, শুধুমাত্র ints জন্য কাজ করে
ডেভিড Wilkins

1
রেজেক্স মাইগ্রেট এমন লোকদের পক্ষে পড়া শক্ত হতে পারে যা এটি কখনও ব্যবহার করেন নি, তবে আপনি এটির সাথে দুর্দান্ত এবং সংক্ষিপ্ত কিছু করতে পারেন
ওলি

56

যদি আপনার ডেটা 'পরীক্ষা', 'টেস্ট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'


আমি এই পদ্ধতিকে আরও ভাল পছন্দ করি কারণ এটি পরিষ্কার এবং কমকেনটেশন ট্রিকের চেয়ে কম "হ্যাকিশ"। ধন্যবাদ!
ব্রোকেলেবিল্ডগাইন

8
নেতিবাচক মানগুলির জন্য কাজ করছে না। আমি নীচে প্রস্তাবিত রেজিএক্সএক্স সংশোধন করব:REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
নিকোলাস

আমি বলব "+" চিহ্নটি প্রয়োজনীয় নয়, আপনি কেবল একটি "-?" ব্যবহার করতে পারেন, তবে আপনি যদি এটি ব্যবহার করতে চান তবে আপনার এটিকে অব্যাহতি দেওয়া উচিত (এবং "-" চিহ্নটি এড়ানোর দরকার নেই) ।
টি কর্নার

13
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

ডেমো


3
পারফেক্ট! কেবলমাত্র এমন উত্তর যা প্রকৃতপক্ষে সমস্ত ঘাঁটিগুলি কভার করে। গ্রহণযোগ্য উত্তর হওয়া উচিত।
ডোম

10

সংখ্যক সারি প্রদান করে

আমি নিম্নলিখিত প্রশ্নের সাথে সমাধানটি পেয়েছি এবং আমার জন্য কাজ করে:

SELECT * FROM myTable WHERE col1 > 0;

এই কোয়েরিতে শূন্য সংখ্যার কলামের চেয়ে বেশি থাকা সারিগুলি ফেরত দেয় col1

সংখ্যাবিহীন সারিগুলি প্রদান করে

আপনি যদি কলামটি সংখ্যায় না পরীক্ষা করতে চান তবে ট্রিকটি দিয়ে চেষ্টা করে দেখুন ( !col1 > 0):

SELECT * FROM myTable WHERE !col1 > 0;

এটি কাজ করে না, যদি আপনার কাছে একটি স্ট্রিং থাকে যা একটি "123abc" সংখ্যা দিয়ে শুরু হয় তবে এটি আপনার সংখ্যা সারি বিবৃতিতে ফিরে আসবে, অ-সংখ্যাসূচক বিবৃতিতে নয়।
জেস্টেফেন

@ জেস্টেফেন আপনি ঠিক বলেছেন! কারণ SELECT * FROM myTable WHERE col1 = 123;কোয়েরিটি সারিগুলি ফিরিয়ে দেবে এমনকি করুল মানটি হ'ল123abc
বোরা

9

এই উত্তর দিমিত্রি এর অনুরূপ, তবে এটি দশমিকের পাশাপাশি ইতিবাচক এবং নেতিবাচক সংখ্যার জন্যও অনুমতি দেবে।

select * from table where col1 REGEXP '^[[:digit:]]+$'

8

একটি ইউডিএফ (ব্যবহারকারী সংজ্ঞায়িত ফাংশন) ব্যবহার করুন।

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');

আশাকরি এটা সাহায্য করবে.


5

আর একটি বিকল্প যা আমার কম্পিউটারে আরজিএক্সপি-র চেয়ে দ্রুত বলে মনে হচ্ছে তা হ'ল

SELECT * FROM myTable WHERE col1*0 != col1;

এটি এমন সমস্ত সারি নির্বাচন করবে যেখানে কল 1 সংখ্যার মান দিয়ে শুরু হয় starts


2
মান শূন্য হলে কী হবে?
উরবিকোজ

1
আমার ধারণা আপনি AND col1<>0ব্যতিক্রমটি সামলানোর জন্য কেবল যোগ করতে পারেন ।
উরবিকোজ

এটি সত্য যে এটি শূন্য মানের জন্য কাজ করে না তবে এটি প্যাডযুক্ত সংখ্যার জন্য নিখুঁতভাবে কাজ করে, যেমন 004 00 গৃহীত উত্তর প্যাডড সংখ্যার জন্য কাজ করে না
আব্বাস

আমি মনে করি এটি সংখ্যা পরীক্ষা করার সেরা উপায়। এটি কেবলমাত্র শূন্য যাচাইয়ের জন্য আমাদের একটি OR বিবৃতি যুক্ত করতে হবে, যেখানে MyTable থেকে SE1 * যেমন কল 1 * 0! = কল 1 বা কোল 1 = '0';
বিনু রমন

আমি একটি মিথ্যা ইতিবাচক পেতে '1a'বিটিডব্লিউ : এটি সমান WHERE col1 <> 0- rextester.com/DJIS1493
পল স্পিগেল

4

এখনও এই সহজ সংস্করণটি অনুপস্থিত:

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

3
আমি ভুল বোঝাবুঝি না করে, মাইএসকিউএল যে কোনও স্ট্রিংকে 0 এ রূপান্তর করে যাতে এটি স্ট্রিং এবং সংখ্যার মধ্যে পার্থক্য না করে, উভয়ই একই রকম ফিরে আসবে।
ইভান ম্যাকা

3
'a' + 0 = 'a'সত্য
পল স্পিগেল

3

আমি প্রস্তাব দিচ্ছি: আপনার সন্ধানটি যদি সহজ হয় তবে আপনি `ব্যবহার করতে পারেন`

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**)

1
আপনি কি জানেন যে মাইএসকিউএল এ উভয়ই সত্য select 'aaa123' >= 0এবং select '123aaa' >= 0ফিরে আসবে?
গ্রেজগোর্জ স্মুলকো

1
SELECT * FROM myTable WHERE sign (col1)!=0

অবশ্যই সাইন (0) শূন্য, তবে তারপরে আপনি আপনার ক্যোয়ারিকে সীমাবদ্ধ রাখতে পারবেন ...

SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0

আপডেট: এটি 100% নির্ভরযোগ্য নয়, কারণ "1abc" 1 এর চিহ্নটি ফিরে আসবে, তবে "ab1c" শূন্য ফিরে আসবে ... সুতরাং এটি কেবলমাত্র পাঠ্যের জন্য কাজ করতে পারে যা সংখ্যা দিয়ে শুরু হয় না।


0

আপনি ব্যবহার করতে পারেন CAST

  SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")


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