web-dev-qa-db-ja.com

SQLiteクエリで正規表現を使用するにはどうすればよいですか?

Sqliteで正規表現を使用したいのですが、方法がわかりません。

私のテーブルには、「3,12,13,14,19,28,32」のような文字列の列があります。「where x LIKE '3'」と入力すると、13または32のような値を含む行も取得されます。 、しかし、私はその文字列で値3を正確に持っている行だけを取得したいです。

誰もこれを解決する方法を知っていますか?

92
cody

SQLite3はREGEXP演算子をサポートしています。

WHERE x REGEXP <regex>

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

67
DanS

他の人がすでに指摘したように、REGEXPはユーザー定義関数を呼び出します。この関数は最初に定義してデータベースにロードする必要があります。いくつかのsqliteディストリビューションまたはGUIツールにはデフォルトで含まれていますが、Ubuntuには含まれていません。解決策は

Sudo apt-get install sqlite3-pcre

/usr/lib/sqlite3/pcre.soのロード可能なモジュールにPerl正規表現を実装します

それを使用できるようにするには、データベースを開くたびにロードする必要があります。

.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';"

Windowsを使用している場合、同様の.dllファイルがどこかにあるはずです。

100
mivk

正規表現なしでそれを解決するためのハックな方法はwhere ',' || x || ',' like '%,3,%'です

29
Blorgbeard

SQLiteには、デフォルトでは正規表現機能が含まれていません。

REGEXP演算子を定義していますが、ユーザーまたはフレームワーク ユーザー関数の定義regexp()が呼び出されない限り、これはエラーメッセージで失敗します。これを行う方法は、プラットフォームによって異なります。

regexp()関数が定義されている場合、次のようにコンマ区切りリストから任意の整数を照合できます。

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

しかし、実際には、 データベース構造を正規化 これらの 単一列内のグループ を各番号の個別の行に置き換えると、物事がはるかに簡単になりますコンマ区切りリスト。次に、正規表現の代わりに=演算子を使用できるだけでなく、SQLが提供する結合などのより強力なリレーショナルツールも使用できます。

20
Ian Mackinnon

MySQLの動作を模倣するREGEXPキーワード用の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のいずれかがNULLの場合、MySQLと同様に結果はNULLになります。

14
Alix Axel

ほぼ1年前に投稿された質問に答えるのは良いことではありません。しかし、Sqlite自体が関数REGEXPを提供すると考えている人のためにこれを書いています。

SqliteでREGEXP関数を呼び出すための基本的な要件の1つは、
"アプリケーションに独自の関数を作成してから、sqliteドライバーへのコールバックリンクを提供する必要があります"
そのためには、sqlite_create_function(Cインターフェイス)を使用する必要があります。詳細は here および here から見つけることができます

5
Naved
UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'

そして:

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'
4
user4813855

sqlite3を使用したpythonのソリューション:

   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になります。

4
aGuegu

包括的なor'ed where句は、文字列の連結なしで実行できます。

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

4つのケースの完全一致、リストの終わり、リストの始まり、および中間リストが含まれます。

これはより冗長であり、正規表現拡張機能を必要としません。

3
phyatt

REGEXP で正規表現を使用できますが、これは完全に一致するばかげた方法です。

WHERE x = '3'と言うだけです。

2
Quentin

これを使用することを検討してください

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

これは、xが次の場合に正確に3と一致します。

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

他の例:

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

これは3または13に一致します

2
itsjavi

誰かがAndroid Sqliteの非正規表現条件を探している場合、この文字列[1,2,3,4,5]のように、他の場合と同じブラケット([])を追加することを忘れないでください@phyatt条件の括弧({})などの特殊文字

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

Phpを使用している場合、 SQLite3 :: createFunction を使用して、SQLステートメントに関数を追加できます。 PDOでは、 PDO :: sqliteCreateFunction を使用し、ステートメント内で preg_match 関数を実装できます。

Havaliteによってどのように行われるかを参照してください( Phpを使用したSqLiteのRegExp

0
code19

また考慮するかもしれません

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

これにより、任意の位置の任意の文字列で番号3を検索できます

0
Avrob