[regex] SQLite 쿼리에서 정규식을 어떻게 사용합니까?

sqlite에서 정규식을 사용하고 싶지만 방법을 모르겠습니다.

내 테이블에 다음과 같은 문자열이있는 열이 있습니다. “3,12,13,14,19,28,32”이제 “where x LIKE ‘3’”을 입력하면 13 또는 32와 같은 값이 포함 된 행도 가져옵니다. ,하지만 해당 문자열에 정확히 3 값이있는 행만 가져오고 싶습니다.

누구든지 이것을 해결하는 방법을 알고 있습니까?



답변

SQLite3는 REGEXP 연산자를 지원합니다.

WHERE x REGEXP <regex>

http://www.sqlite.org/lang_expr.html#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 파일이 어딘가에있을 것입니다.


답변

정규식없이 해결하는 해키 방법은 where ',' || x || ',' like '%,3,%'


답변

SQLite는 기본적으로 정규식 기능을 포함하지 않습니다.

REGEXP연산자를 정의 하지만 사용자 또는 프레임 워크가 호출 된 사용자 함수를 정의 하지 않는 한 오류 메시지와 함께 실패합니다.regexp() . 이를 수행하는 방법은 플랫폼에 따라 다릅니다.

당신이 regexp()정의 된 함수 과 같이 쉼표로 구분 된 목록에서 임의의 정수를 일치시킬 수 있습니다.

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

그러나 실제로 는 단일 열 내의 그룹을 쉼표로 구분 된 목록의 각 숫자에 대해 별도의 행 으로 대체 하여 데이터베이스 구조정규화 하면 훨씬 쉽게 찾을 수있을 것 같습니다 . 그러면 정규식 대신 연산자를 사용할 수있을뿐만 아니라 SQL이 제공하는 조인과 같은보다 강력한 관계형 도구를 사용할 수도 있습니다.=


답변

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은 같은 – 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이됩니다.


답변

거의 1 년 전에 게시 된 질문에 답하는 것은 좋지 않습니다. 하지만 Sqlite 자체가 REGEXP 기능을 제공한다고 생각하는 사람들을 위해이 글을 쓰고 있습니다. .

sqlite에서 REGEXP 함수를 호출하기위한 기본 요구 사항 중 하나는
“응용 프로그램에서 고유 한 함수를 만든 다음 sqlite 드라이버에 대한 콜백 링크를 제공해야합니다” 입니다.
이를 위해서는 sqlite_create_function (C 인터페이스)을 사용해야합니다. 여기여기 에서 세부 사항을 찾을 수 있습니다