sqlite에서 정규식을 사용하고 싶지만 방법을 모르겠습니다.
내 테이블에 다음과 같은 문자열이있는 열이 있습니다. "3,12,13,14,19,28,32"이제 "where x LIKE '3'"을 입력하면 13 또는 32와 같은 값이 포함 된 행도 가져옵니다. ,하지만 해당 문자열에 정확히 3 값이있는 행만 가져오고 싶습니다.
누구든지 이것을 해결하는 방법을 알고 있습니까?
sqlite에서 정규식을 사용하고 싶지만 방법을 모르겠습니다.
내 테이블에 다음과 같은 문자열이있는 열이 있습니다. "3,12,13,14,19,28,32"이제 "where x LIKE '3'"을 입력하면 13 또는 32와 같은 값이 포함 된 행도 가져옵니다. ,하지만 해당 문자열에 정확히 3 값이있는 행만 가져오고 싶습니다.
누구든지 이것을 해결하는 방법을 알고 있습니까?
답변:
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
단지 MySQL은 같은 - NULL이며, 그 결과는 NULL이다.
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이됩니다.
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 함수를 구현할 수 있습니다 .