আমি কীভাবে একটি এসকিউএল ক্যোয়ারিতে রেজেেক্স ব্যবহার করব?


107

আমি স্ক্লাইটে নিয়মিত ভাব প্রকাশ করতে চাই, তবে কীভাবে তা আমি জানি না।

আমার টেবিলটি এর মতো স্ট্রিং সহ একটি কলাম পেয়েছে: "3,12,13,14,19,28,32" এখন যদি আমি টাইপ করি তবে যেখানে "x x 'পছন্দ হয়" আমিও সারিগুলি পেতে পারি যার মধ্যে 13 বা 32 এর মতো মান রয়েছে I , তবে আমি কেবল সেই সারিগুলি পেতে চাই যার স্ট্রিংটিতে 3 টির মান রয়েছে।

কেউ এই সমস্যার সমাধানের কিভাবে জানে?


4
এই উত্তরটি মধ্যে C # SQLite করার RegExp ফাংশন যোগ জন্য সবচেয়ে ভাল হয় stackoverflow.com/a/26155359/5734452
hubaishan

উত্তর:


76

এসকিউএলাইট 3 রিগেক্স অপারেটরটিকে সমর্থন করে:

WHERE x REGEXP <regex>

http://www.sqlite.org/lang_expr.html#regexp


4
আমি একটি সহজ উপায় খুঁজে পেয়েছি: এটি কেবলমাত্র \ bx \ b যেখানে x স্ট্রিংটিতে সন্ধান করার জন্য মূল্য হল :)
কোডি

12
@ ড্যানস: অপারেটরকে regex()সমর্থন করতে আপনি কীভাবে একটি ফাংশন যুক্ত করবেন REGEXP? ডিফল্টরূপে একটি ব্যবহারকারীর ফাংশন যুক্ত করা হয়নি।
এসকে

49
স্ক্লাইট ডক্স অনুসারে: আরইজিএক্সপি অপারেটরটি রেজিএক্সএক্স () ব্যবহারকারী ফাংশনের জন্য একটি বিশেষ সিনট্যাক্স। কোনও রেজিএক্সপ্যাক () ব্যবহারকারীর ফাংশনটি ডিফল্টরূপে সংজ্ঞায়িত হয় না এবং তাই REGEXP অপারেটরের ব্যবহারের ফলে সাধারণত একটি ত্রুটি বার্তা আসে। যদি রান-টাইমে একটি অ্যাপ্লিকেশন-সংজ্ঞায়িত এসকিউএল ফাংশন যুক্ত হয় "রেজিএক্সপেক্স" রান-টাইমে যোগ করা হয় তবে সেই ফাংশনটি আরজিইএক্সপি অপারেটর বাস্তবায়নের জন্য ডাকা হবে। ( Sqlite.org/lang_expr.html#regexp )
radicand

আমাদের মধ্যে যারা ত্রুটি পান যখন আপনি নীচের প্রতিক্রিয়াটি যাচাই করার চেষ্টা করেন এটি stackoverflow.com/a/18484596/1585572 আমি একটি ফাইলে কোডটি রেখেছি এবং এটি আমার ফায়ারফক্স স্ক্লাইট ম্যানেজারের ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলিতে আমদানি করেছি। আপনাকে এটিকে কিছুটা আলাদাভাবে ডাকতে হবে, যেমন: যেমনটি কলাম রিজেক্সেপ ("মাইরেজেক্সেপ") থেকে টেবিল নির্বাচন করুন
ত্রিস্তান

4
এটি কীভাবে গৃহীত উত্তর? দয়া করে নীচে mivk এর বেশী রেট উত্তর দেখার stackoverflow.com/a/8338515/828885
akhan

116

অন্যরা ইতিমধ্যে ইঙ্গিত হিসাবে, REGEXP একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন কল যা প্রথমে ডেটাবেসে সংজ্ঞায়িত এবং লোড করা আবশ্যক। হয়তো কিছু স্ক্লাইট ডিস্ট্রিবিউশন বা জিইউআই সরঞ্জামগুলি এটি ডিফল্টরূপে অন্তর্ভুক্ত করে তবে আমার উবুন্টু ইনস্টলটি তা করেনি। সমাধান ছিল

sudo apt-get install sqlite3-pcre

যা লোডযোগ্য মডিউলটিতে পার্ল নিয়মিত এক্সপ্রেশনগুলি প্রয়োগ করে /usr/lib/sqlite3/pcre.so

এটি ব্যবহারে সক্ষম হতে, আপনি যখনই ডাটাবেস খুলবেন তখন আপনাকে এটি লোড করতে হবে:

.load /usr/lib/sqlite3/pcre.so

অথবা আপনি যে লাইন আপনার মধ্যে রাখতে পারে ~/.sqliterc

এখন আপনি এই জাতীয়ভাবে জিজ্ঞাসা করতে পারেন:

SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';

আপনি যদি কমান্ড-লাইন থেকে সরাসরি জিজ্ঞাসা করতে চান, আপনি -cmdআপনার এসকিউএল এর আগে লাইব্রেরিটি লোড করতে সুইচটি ব্যবহার করতে পারেন :

sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"

আপনি যদি উইন্ডোজটিতে থাকেন তবে আমার ধারণা, অনুরূপ একটি .dll ফাইল কোথাও পাওয়া উচিত।


15
আর একটি লোড বিকল্প: আমি এটি দিয়ে একটি ভিউ তৈরি করেছি: নির্বাচন করুন লোড_ এক্সটেনশন ('/ usr / lib / sqlite3 / pcre.so'); আমি যখন ডিবিতে জিইউআই ভিত্তিক এন্ট্রি পয়েন্টটি ব্যবহার করি (ফায়ারফক্সে এসকিউএলাইট ম্যানেজারের মতো), তখন আমার কাছে রেগেক্সপি ক্ষমতা লোড করার উপায় আছে way
পলব 22'12

31

রেজেেক্স ছাড়াই এটি সমাধানের একটি হ্যাকি উপায় where ',' || x || ',' like '%,3,%'


4
হ্যাঁ আমি সেভাবেই ভেবেছিলাম তবে "," প্রতিবারের নেতৃত্ব বা অনুসরণ নেই। ধন্যবাদ যাহাই হউক না কেন :-)
কোডি

আমি এখানে সমস্যা উপর পদস্খলন হয়নি না - আমি ভাবছি যদি এই কাজ যেমন এক্স কলাম নাম ...
কোডি

4
আপনার ব্যবহার করা উচিত',' || x || ','
বারুচ

22

এসকিউএলাইটে ডিফল্টরূপে নিয়মিত এক্সপ্রেশন কার্যকারিতা থাকে না।

এটা একটা সংজ্ঞায়িত REGEXPঅপারেটর, কিন্তু এই একটি ত্রুটির বার্তা ব্যর্থ হয়ে যাবে যদি না আপনি বা আপনার ফ্রেমওয়ার্ক একটি ব্যবহারকারী ফাংশন নির্ধারণ নামক regexp()। আপনি কীভাবে এটি করবেন তা আপনার প্ল্যাটফর্মের উপর নির্ভর করবে।

আপনার যদি কোনও regexp()ফাংশন সংজ্ঞায়িত করা থাকে তবে আপনি কমা-বিচ্ছিন্ন তালিকা থেকে একটি স্বেচ্ছাসেবী পূর্ণসংখ্যার সাথে এটি মিলিয়ে দেখতে পারেন:

... WHERE your_column REGEXP "\b" || your_integer || "\b";

তবে সত্যিই, দেখে মনে হচ্ছে আপনি কমা-বিচ্ছিন্ন তালিকার প্রতিটি সংখ্যার জন্য পৃথক সারিতে একটি দলকে একক কলামের মধ্যে এই গ্রুপগুলি প্রতিস্থাপন করে আপনার ডাটাবেস কাঠামোকে সাধারণ করে তুললে জিনিসগুলি পুরোপুরি সহজ হবে । তারপরে আপনি কেবল নিয়মিত অভিব্যক্তির পরিবর্তে অপারেটরটিই ব্যবহার করতে পারবেন না , তবে এসকিউএল আপনাকে সরবরাহ করে এমন আরও শক্তিশালী সম্পর্কযুক্ত সরঞ্জামগুলি ব্যবহার করতে পারেন।=


14

REGEXPমাইএসকিউএলে আচরণের অনুকরণ করে এমন কীওয়ার্ডটির জন্য পিএইচপি / পিডিওতে একটি এসকিউএলআইডি ইউডিএফ :

$pdo->sqliteCreateFunction('regexp',
    function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS')
    {
        if (isset($pattern, $data) === true)
        {
            return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0);
        }

        return null;
    }
);

uপরিবর্তক মাইএসকিউএল বাস্তবায়িত হয় না, কিন্তু আমি এটা দরকারী এটি ডিফল্ট দ্বারা আছে খুঁজে। উদাহরণ:

SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');

যদি হয় $dataবা $patternহয় NULL, ফলাফলটি নুল - ঠিক যেমন MySQL এর মতো in


9

স্কাইলাইট 3 দিয়ে পাইথনে আমার সমাধান:

   import sqlite3
   import re

   def match(expr, item):
        return re.match(expr, item) is not None

   conn = sqlite3.connect(':memory:')
   conn.create_function("MATCHES", 2, match)
   cursor = conn.cursor()
   cursor.execute("SELECT MATCHES('^b', 'busy');")
   print cursor.fetchone()[0]

   cursor.close()
   conn.close()

যদি রেজেক্স মিলে যায় তবে আউটপুটটি 1 হবে, অন্যথায় 0।


5

আমি প্রায় এক বছর আগে পোস্ট করা একটি প্রশ্নের উত্তর দেওয়া ভাল না। তবে আমি তাদের জন্য এটি লিখছি যারা মনে করেন যে স্ক্লাইট নিজেই ফাংশনটি রেগেক্সপি সরবরাহ করে

স্কেলাইটে REGEXP ফাংশনটি আহ্বানের জন্য একটি প্রাথমিক প্রয়োজনীয়তা হ'ল
"আপনার নিজের অ্যাপ্লিকেশনটিতে নিজের ফাংশন তৈরি করতে হবে এবং তারপরে স্ক্লাইট ড্রাইভারকে কলব্যাক লিঙ্ক সরবরাহ করা উচিত"
তার জন্য আপনাকে sqlite_create_function (সি ইন্টারফেস) ব্যবহার করতে হবে। আপনি এখানে এবং এখানে থেকে বিশদটি পেতে পারেন


4
UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'

এবং :

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'

4

একটি বিস্মৃত বা 'ক্লায়েন্ট যেখানে স্ট্রিং কনটেন্টেশন ছাড়াই ক্লজটি এটি করতে পারে:

WHERE ( x == '3' OR
        x LIKE '%,3' OR
        x LIKE '3,%' OR
        x LIKE '%,3,%');

চারটি ক্ষেত্রে সঠিক ম্যাচ, তালিকার শেষ, তালিকার শুরু এবং মধ্য তালিকা অন্তর্ভুক্ত।

এটি আরও ভার্বোজ, এজেন্সি এক্সটেনশন প্রয়োজন হয় না।


4

অজগর দিয়ে, ধরে conনেওয়া এসকিউএলাইটের সাথে সংযোগ, আপনি প্রয়োজনীয় ইউডিএফ লিখে লিখে সংজ্ঞা দিতে পারেন:

con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)

এখানে আরও একটি সম্পূর্ণ উদাহরণ:

import re
import sqlite3

with sqlite3.connect(":memory:") as con:
    con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
    cursor = con.cursor()
    # ...
    cursor.execute("SELECT * from person WHERE surname REGEXP '^A' ")



আইএমএইচও চেক হওয়া উচিত if x not Null and y not Null and re.search(x,y)অন্যথায় এটি নিক্ষেপ করবে।
ফোলাট

2

আপনি আরইজিএক্সপি-র সাথে একটি নিয়মিত প্রকাশটি ব্যবহার করতে পারেন , তবে এটি একটি সঠিক ম্যাচ করার বোকামি।

আপনার শুধু বলা উচিত WHERE x = '3'


আমার এটি আরও ভালভাবে ব্যাখ্যা করা উচিত ছিল (আমার দুর্বল ইংরাজির জন্য দুঃখিত), আমি কেবল একটি নির্দিষ্ট সঠিক মান বোঝাতে চাইছি, সঠিক স্ট্রিং নয়। যাই হোক ধন্যবাদ!
কোডি

2

এটি ব্যবহার বিবেচনা করুন

WHERE x REGEXP '(^|,)(3)(,|$)'

এক্সটি থাকা অবস্থায় এটি ঠিক 3 টির সাথে মিলবে:

  • 3,12,13
  • 12,13,3
  • 12,3,13

অন্যান্য উদাহরণ:

WHERE x REGEXP '(^|,)(3|13)(,|$)'

এটি 3 বা 13 এ মিলবে


1

যদি কেউ এই স্ট্রিংয়ের মতো অ্যান্ড্রয়েড স্ক্লাইটের জন্য নন-রেজেক্স শর্তের সন্ধান করে তবে @ ফ্যাইট শর্তে [1,2,3,4,5]বন্ধনী ( ( } ) এর মতো অন্যান্য বিশেষ অক্ষরের জন্য বন্ধনী ( [] ) একই যুক্ত করতে ভুলবেন না

WHERE ( x == '[3]' OR
        x LIKE '%,3]' OR
        x LIKE '[3,%' OR
        x LIKE '%,3,%');

0

আপনি যদি পিএইচপি ব্যবহার করেন তবে আপনি আপনার এসকিউএল স্টেটমেন্টে যে কোনও ফাংশন যুক্ত করতে পারেন: এসকিউএলআইটি :: ক্রিয়েট ফাংশন ব্যবহার করে । PDO তে আপনি PDO :: sqliteCreateFunction ব্যবহার করতে পারেন এবং আপনার বক্তব্যটির মধ্যে preg_match ফাংশনটি প্রয়োগ করতে পারেন :

এটি কীভাবে হাওয়ালাইট দ্বারা সম্পন্ন হয়েছে ( পিএইচপি ব্যবহার করে স্কিলাইটে RegExp ) দেখুন


মাইএসকিউএল আরজিএক্সএক্সপি ফাংশনে আপনাকে প্যাটার্নে ডিলিমিটার বা সংশোধক উল্লেখ করতে হবে না।
অ্যালিক্স অ্যাক্সেল

0

আপনিও বিবেচনা করতে পারেন

WHERE x REGEXP '(^|\D{1})3(\D{1}|$)'

এটি যে কোনও পজিশনে যে কোনও স্ট্রিংয়ে 3 নম্বর খুঁজে পাওয়ার অনুমতি দেবে


0

জুলিয়ায়, অনুসরণ করার মডেলটি নিম্নরূপ চিত্রিত করা যেতে পারে:

using SQLite
using DataFrames

db = SQLite.DB("<name>.db")

register(db, SQLite.regexp, nargs=2, name="regexp")

SQLite.Query(db, "SELECT * FROM test WHERE name REGEXP '^h';") |> DataFrame

0

রেল জন্য

            db = ActiveRecord::Base.connection.raw_connection
            db.create_function('regexp', 2) do |func, pattern, expression|
              func.result = expression.to_s.match(Regexp.new(pattern.to_s, Regexp::IGNORECASE)) ? 1 : 0
            end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.