回答:
regex()
をサポートする関数をどのように追加しますREGEXP
か?デフォルトでは、ユーザー関数は追加されていません。
他の人がすでに指摘したように、REGEXPは、最初に定義してデータベースにロードする必要があるユーザー定義関数を呼び出します。たぶん、いくつかのsqliteディストリビューションまたはGUIツールにはデフォルトで含まれていますが、私のUbuntuインストールには含まれていません。解決策は
sudo apt-get install sqlite3-pcre
ロード可能なモジュールにPerl正規表現を実装します /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';"
Windowsを使用している場合は、どこかで同様の.dllファイルが利用できるはずです。
SQLiteには、デフォルトでは正規表現機能は含まれていません。
それはREGEXP
演算子を定義しますが、あなたまたはあなたのフレームワークがと呼ばれるユーザー関数を定義しない限り、これはエラーメッセージで失敗しますregexp()
。これを行う方法は、プラットフォームによって異なります。
regexp()
関数を定義している場合は、次のようにカンマ区切りのリストから任意の整数を照合できます。
... WHERE your_column REGEXP "\b" || your_integer || "\b";
しかし、実際には、単一の列内のグループをカンマ区切りリストの各数値の個別の行に置き換えることでデータベース構造を正規化すると、はるかに簡単に見つけることができるように見えます。次に、正規表現の代わりに演算子を使用するだけでなく、SQLが提供する結合などのより強力なリレーショナルツールを使用することもできます。=
REGEXP
MySQLでの動作を模倣するキーワード用の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になります。
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になります。
UPDATE TableName
SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'
そして:
SELECT * from TableName
WHERE YourField REGEXP 'YOUR REGEX'
Pythonでは、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' ")
if x not Null and y not Null and re.search(x,y)
それ以外の場合はスローされます。
phpを使用している場合は、SQLite3 :: createFunctionを使用してSQLステートメントに関数を追加できます。PDO では、PDO :: sqliteCreateFunctionを使用して、ステートメント内にpreg_match関数を実装できます。
(Havaliteによってどのように行われ、その参照SQLiteのは、PHPを使用して正規表現)
レール用
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