मैं SQLite क्वेरी में रेगेक्स का उपयोग कैसे करूं?


102

मैं sqlite में एक नियमित अभिव्यक्ति का उपयोग करना चाहता हूं, लेकिन मुझे नहीं पता कि कैसे।

मेरी तालिका को इस तरह से तार के साथ एक कॉलम मिला है: "3,12,13,14,19,28,32" अब अगर मैं टाइप करता हूं "जहां x LIKE '3'" मैं भी पंक्तियां प्राप्त करता हूं जिसमें 13 या 32 जैसे मान हैं , लेकिन मैं केवल उन पंक्तियों को प्राप्त करना चाहूंगा जिनके पास उस स्ट्रिंग में मूल्य 3 है।

क्या किसी को पता है यह कैसे हल करना है?


यह जवाब REGEXP फ़ंक्शन को cclite में c # stackoverflow.com/a/26155359/5734452
hubaishan

जवाबों:


74

SQLite3 REGEXP ऑपरेटर का समर्थन करता है:

WHERE x REGEXP <regex>

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


3
मुझे एक आसान तरीका मिला: यह बस \ bx \ b है जहाँ x को स्ट्रिंग में देखने का मान है :)
cody

12
@ दान: आप ऑपरेटर regex()का समर्थन करने के लिए एक फ़ंक्शन कैसे जोड़ते हैं REGEXP? डिफ़ॉल्ट रूप से एक उपयोगकर्ता फ़ंक्शन जोड़ा नहीं गया है।
SK9 4

47
Sqlite डॉक्स के अनुसार: REGEXP ऑपरेटर regexp () उपयोगकर्ता फ़ंक्शन के लिए एक विशेष सिंटैक्स है। कोई भी regexp () उपयोगकर्ता फ़ंक्शन डिफ़ॉल्ट रूप से परिभाषित नहीं होता है और इसलिए REGEXP ऑपरेटर का उपयोग आम तौर पर एक त्रुटि संदेश में होगा। यदि "regexp" नाम का एक अनुप्रयोग-परिभाषित SQL फ़ंक्शन रन-टाइम में जोड़ा जाता है, तो उस फ़ंक्शन को REGEXP ऑपरेटर को लागू करने के लिए बुलाया जाएगा। ( sqlite.org/lang_expr.html#regexp )
रेडिकैंड

हममें से जो कोई त्रुटि प्राप्त करते हैं, जब आप इस जांच का प्रयास करते हैं, तो नीचे दिए गए जवाब के नीचे stackoverflow.com/a/18484596/1585572 मैंने कोड को एक फ़ाइल में डाल दिया और इसे अपने फ़ायरफ़ॉक्स स्क्लाइट मैनेजर में यूज़र-डिफ़ाइंड फ़ंक्शंस पर आयात किया। आपको इसे थोड़ा अलग तरीके से आह्वान करना होगा, हालांकि, इस तरह: SELECT * FROM टेबल WHERE कॉलम regexp ("myregexp")
Tristan

112

जैसा कि अन्य ने पहले ही बताया है, REGEXP एक उपयोगकर्ता परिभाषित फ़ंक्शन को कॉल करता है जिसे पहले डेटाबेस में परिभाषित और लोड किया जाना चाहिए। हो सकता है कि कुछ sqlite वितरण या GUI टूल इसे डिफ़ॉल्ट रूप से शामिल करते हैं, लेकिन मेरी उबंटू इंस्टॉल नहीं हुई। समाधान था

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अपनी SQL से पहले लाइब्रेरी को लोड करने के लिए स्विच का उपयोग कर सकते हैं :

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

यदि आप विंडोज पर हैं, तो मुझे लगता है कि एक समान। Dll फ़ाइल कहीं उपलब्ध होनी चाहिए।


15
एक और लोड विकल्प: मैंने इसके साथ एक दृश्य बनाया: Select load_extension ('/ usr / lib / sqlite3 / pcre.so'); इस तरह जब मैं DB (SQLite प्रबंधक में फ़ायरफ़ॉक्स में) की तरह एक GUI आधारित प्रवेश बिंदु का उपयोग करता हूं, तो मेरे पास REGEXP क्षमता लोड करने का एक तरीका है।
पॉलब

30

रेगेक्स के बिना इसे हल करने का एक हैकरी तरीका है where ',' || x || ',' like '%,3,%'


1
हां, मैंने इस तरह से सोचा था, लेकिन हर बार अग्रणी या पीछा नहीं कर रहे हैं "। वैसे भी धन्यवाद :-)
कोड़ी

मैं यहाँ समस्या पर ठोकर नहीं खाई - मुझे आश्चर्य है कि अगर यह x स्तंभ नाम है ...
cody

3
आप का उपयोग करना चाहिए',' || x || ','
बारूक

21

SQLite में डिफ़ॉल्ट रूप से नियमित अभिव्यक्ति की कार्यक्षमता नहीं होती है।

यह एक REGEXPऑपरेटर को परिभाषित करता है , लेकिन यह तब तक एक त्रुटि संदेश के साथ विफल हो जाएगा जब तक कि आप या आपका फ्रेमवर्क एक उपयोगकर्ता फ़ंक्शन को परिभाषित नहीं करता है regexp()। आप यह कैसे करते हैं यह आपके प्लेटफॉर्म पर निर्भर करेगा।

यदि आपके पास कोई regexp()फ़ंक्शन परिभाषित है, तो आप कॉमा से अलग की गई सूची से एक मनमाने ढंग से पूर्णांक का मिलान कर सकते हैं:

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

लेकिन वास्तव में, ऐसा लगता है कि अगर आप कॉमा-अलग सूची में प्रत्येक संख्या के लिए एक अलग पंक्ति के साथ एक एकल स्तंभ के भीतर उन समूहों को बदलकर अपनी डेटाबेस संरचना को सामान्य करते हैं, तो आपको बहुत आसान चीजें मिलेंगी। तब आप न केवल एक नियमित अभिव्यक्ति के बजाय ऑपरेटर का उपयोग कर सकते थे , बल्कि अधिक शक्तिशाली संबंधपरक उपकरणों का भी उपयोग कर सकते थे जैसे कि SQL आपके लिए प्रदान करता है।=


14

REGEXPMySQL में व्यवहार की नकल करने वाले कीवर्ड के लिए PHP / PDO में एक SQLite UDF :

$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संशोधक MySQL में लागू नहीं है, लेकिन मैं इसे उपयोगी यह डिफ़ॉल्ट रूप से शामिल करना होता है। उदाहरण:

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

यदि दोनों में से $dataया $patternशून्य है, परिणाम शून्य है - बस MySQL में की तरह।


8

sqlite3 के साथ अजगर में मेरा समाधान:

   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

मैं एक सवाल का जवाब देना अच्छा नहीं मानता, जो लगभग एक साल पहले पोस्ट किया गया था। लेकिन मैं यह उन लोगों के लिए लिख रहा हूं जो सोचते हैं कि Sqlite स्वयं फ़ंक्शन REGEXP प्रदान करता है ।

फ़ंक्शन का एक मूल आवेश रेजक्लेक्स को sqlite में लागू करना है
"आपको एप्लिकेशन में अपना फ़ंक्शन बनाना चाहिए और फिर sqlite ड्राइवर को कॉलबैक लिंक प्रदान करना चाहिए"
उसके लिए आपको sqlite_create_function (C इंटरफ़ेस) का उपयोग करना होगा। आप यहाँ और यहाँ से विस्तार पा सकते हैं


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कि SQLite से संबंध है, आप लिखकर आवश्यक UDF को परिभाषित कर सकते हैं:

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


IMHO चेक होना चाहिए if x not Null and y not Null and re.search(x,y)अन्यथा वह फेंक देगा।
फोलट

2

आप REGEXP के साथ एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं , लेकिन यह एक सटीक मैच करने का एक मूर्खतापूर्ण तरीका है।

आपको बस कहना चाहिए WHERE x = '3'


मुझे इसे बेहतर तरीके से समझाना चाहिए था (मेरे खराब अंग्रेजी के लिए खेद है), मेरा मतलब केवल एक निश्चित सटीक मूल्य था, सटीक स्ट्रिंग नहीं। फिर भी धन्यवाद!
कोड़ी

2

इसका उपयोग करने पर विचार करें

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

जब x में हो तो यह ठीक 3 से मेल खाएगा:

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

अन्य उदाहरण:

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

यह 3 या 13 को मैच होगा


1

यदि कोई व्यक्ति एंड्रॉइड स्क्लाइट के लिए गैर-रेगेक्स स्थिति देख रहा है , [1,2,3,4,5]तो इस स्ट्रिंग की तरह तो कोष्ठक ( [] ) को जोड़ने के लिए मत भूलना जैसे अन्य विशेष वर्णों के लिए जैसे @phyatt स्थिति में कोष्ठक ( {} )

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

0

यदि आप php का उपयोग कर रहे हैं तो आप अपने sql स्टेटमेंट में किसी भी फ़ंक्शन को जोड़कर उपयोग कर सकते हैं: SQLite3 :: createFunction । पीडीओ में आप पीडीओ :: sqliteCreateFunction का उपयोग कर सकते हैं और अपने बयान के भीतर preg_match फ़ंक्शन को लागू कर सकते हैं :

देखें कि इसका हैवेलिट ने कैसे किया ( Regpp इन SqLite पीएचपी का उपयोग करके )


MySQL 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.