Sqliteで正規表現を使用したいのですが、方法がわかりません。
私のテーブルには、「3,12,13,14,19,28,32」のような文字列の列があります。「where x LIKE '3'」と入力すると、13または32のような値を含む行も取得されます。 、しかし、私はその文字列で値3を正確に持っている行だけを取得したいです。
誰もこれを解決する方法を知っていますか?
他の人がすでに指摘したように、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ファイルがどこかにあるはずです。
正規表現なしでそれを解決するためのハックな方法はwhere ',' || x || ',' like '%,3,%'
です
SQLiteには、デフォルトでは正規表現機能が含まれていません。
REGEXP
演算子を定義していますが、ユーザーまたはフレームワーク ユーザー関数の定義regexp()
が呼び出されない限り、これはエラーメッセージで失敗します。これを行う方法は、プラットフォームによって異なります。
regexp()
関数が定義されている場合、次のようにコンマ区切りリストから任意の整数を照合できます。
... WHERE your_column REGEXP "\b" || your_integer || "\b";
しかし、実際には、 データベース構造を正規化 これらの 単一列内のグループ を各番号の個別の行に置き換えると、物事がはるかに簡単になりますコンマ区切りリスト。次に、正規表現の代わりに=
演算子を使用できるだけでなく、SQLが提供する結合などのより強力なリレーショナルツールも使用できます。
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になります。
UPDATE TableName
SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'
そして:
SELECT * from TableName
WHERE YourField REGEXP 'YOUR REGEX'
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になります。
包括的なor'ed where句は、文字列の連結なしで実行できます。
WHERE ( x == '3' OR
x LIKE '%,3' OR
x LIKE '3,%' OR
x LIKE '%,3,%');
4つのケースの完全一致、リストの終わり、リストの始まり、および中間リストが含まれます。
これはより冗長であり、正規表現拡張機能を必要としません。
REGEXP で正規表現を使用できますが、これは完全に一致するばかげた方法です。
WHERE x = '3'
と言うだけです。
これを使用することを検討してください
WHERE x REGEXP '(^|,)(3)(,|$)'
これは、xが次の場合に正確に3と一致します。
他の例:
WHERE x REGEXP '(^|,)(3|13)(,|$)'
これは3または13に一致します
誰かがAndroid Sqliteの非正規表現条件を探している場合、この文字列[1,2,3,4,5]
のように、他の場合と同じブラケット([])を追加することを忘れないでください@phyatt条件の括弧({})などの特殊文字
WHERE ( x == '[3]' OR
x LIKE '%,3]' OR
x LIKE '[3,%' OR
x LIKE '%,3,%');
Phpを使用している場合、 SQLite3 :: createFunction を使用して、SQLステートメントに関数を追加できます。 PDOでは、 PDO :: sqliteCreateFunction を使用し、ステートメント内で preg_match 関数を実装できます。
Havaliteによってどのように行われるかを参照してください( Phpを使用したSqLiteのRegExp )
また考慮するかもしれません
WHERE x REGEXP '(^|\D{1})3(\D{1}|$)'
これにより、任意の位置の任意の文字列で番号3を検索できます