মাইএসকিউএল-এ REGEXP ব্যবহার করে কীভাবে সাবস্ক্রটিং ব্যবহার করবেন


14

আমার নিম্নলিখিত পরিস্থিতি আছে। আমার মাইএসকিউএল ব্যবহার করে বিবরণ থেকে নিয়মিত অভিব্যক্তি সাবস্ট্রিং করতে হবে। বর্ণনা:

হোম D9801 বাথরুম বসতে সরবরাহকারী

যেখানে D9801 হ'ল REGEXP। প্রতিটি দৃ text় পাঠ্যের বিবরণে আলাদা আলাদা সামগ্রী থাকে তবে আমার রিজেপেক্সটি দেখতে পাওয়া উচিত: REGEXP 'D [[: ডিজিট:]] {4}'

আরজিইএক্সপি-এর সর্বদা শুরুতে "ডি" থাকে এবং শেষে "এক্সএক্সএক্সএক্সএক্স" থাকে - 4 সংখ্যার: ডিএক্সএক্সএক্সএক্স

আমি জানি যে REGEXP কেবল সঠিক / মিথ্যা মান প্রদান করে, তবে কেবলমাত্র 'D9801' মান ফেরত দেওয়ার জন্য কীভাবে আমি কোয়েরি করতে পারি?

আমি এরকম কিছু চেষ্টা করেছি:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

আমি জানি এটি ভুল, তাই আমি এটি দিয়ে চেষ্টা করব:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

কিন্তু কীভাবে রেজিপেক্সের অবস্থান সন্ধান করবেন?

আমি ইউডিএফ সম্পর্কে শুনেছি কিন্তু আমি এটি ব্যবহার করতে পারি না, আমি ওভিএইচ হোস্টিং ব্যবহার করি।


এটি মূলত: এর একদল
নাথান ফেজার

কোনও ইউডিএফ ব্যবহার না করেই আরইজিএক্সপি ফাংশন থেকে ম্যাচিং প্যাটার্নটি পুনরুদ্ধার করার জন্য কার্যকারিতা তৈরির কোনও বিল্ড নেই এবং অন্যান্য মিলের পদ্ধতিগুলি আপনি যে পুরো স্ট্রিংয়ের সাথে মিলেছেন তার উপর নির্ভর করে যা এই পরিস্থিতিতে কাজ করে না
Payload

উত্তর:


3

স্ট্রিংয়ের বাইরে তথ্য পেতে এটিকে LOCATEএবং SUBSTRINGসিনট্যাক্সটি ব্যবহার করতে হবে। আপনার প্রয়োজনীয় বেসিক সিটেক্সটি এখানে ব্যাখ্যা করা হয়েছে

অবস্থান (অনুসন্ধান টিআর, টিআরআর, [অবস্থান])

অনুসন্ধান str = একটি স্ট্রিং যা অনুসন্ধান করা হবে।

str = একটি স্ট্রিং যা অনুসন্ধান করা হচ্ছে।

অবস্থান (alচ্ছিক) = অবস্থান যেখানে (দ্বিতীয় যুক্তির মধ্যে) অনুসন্ধান শুরু হবে।

আপনার প্রয়োজন সাবস্ট্রিং ফাংশনটি এখানে ব্যাখ্যা করা হয়েছে

জমা দেওয়া (স্ট্রিং, পোস্ট, লেন)

str = একটি স্ট্রিং।

pos = শুরু করার অবস্থান।

লেন = অক্ষরে দৈর্ঘ্য।

এটিকে দেখার সহজ উপায় হ'ল নিম্নোক্ত সাবস্ট্রাস্টিং হিসাবে সাবস্ট্রিংয়ের কথা ভাবা (লেনের জন্য পোস্ট থেকে পোস্ট)

আমি দ্বিতীয় শব্দটি পেতে যে সিনট্যাক্সটি ব্যবহার করেছি তা নীচে রয়েছে, আমি যে শূন্যস্থানগুলি আপনি দ্বিতীয় বার বের করতে চেষ্টা করছেন তার চারপাশে প্রায়শই স্পেস রেখেছি।

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)

1

দুর্ভাগ্যক্রমে, মাইএসকিউএল এর নিয়মিত এক্সপ্রেশন ফাংশনটি সত্য, মিথ্যা বা নাল ফিরে দেয় যদি অভিব্যক্তিটি বিদ্যমান থাকে বা না থাকে তার উপর নির্ভর করে।

কাঙ্ক্ষিত আচরণকে প্রভাবিত করার কৌশলটি হ'ল নির্ধারণ করা হয় যে আপনি যে চরিত্রটি যত্ন করছেন তার সাথে কোন স্ট্রিং শুরু হয়, সঠিক দৈর্ঘ্য রয়েছে এবং তার পরে একটি সংখ্যা রয়েছে by স্ট্রিংটি উত্তোলনের জন্য একটি সিরিজ সাবস্ট্রিং_ইন্ডেক্স ফাংশন ব্যবহার করা হয় ...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.