Câu hỏi Làm cách nào để sử dụng regex trong truy vấn SQLite?


Tôi muốn sử dụng một biểu thức chính quy trong sqlite, nhưng tôi không biết làm thế nào.

Bảng của tôi có một cột với chuỗi như sau: "3,12,13,14,19,28,32" Bây giờ nếu tôi nhập "where x LIKE '3'", tôi cũng nhận được các hàng có chứa các giá trị như 13 hoặc 32, nhưng tôi muốn chỉ nhận được các hàng có chính xác giá trị 3 trong chuỗi đó.

Có ai biết cách giải quyết vấn đề này không?


76
2018-02-21 21:43


gốc


Câu trả lời này là tốt nhất để thêm hàm REGEXP vào sqlite trong c # stackoverflow.com/a/26155359/5734452 - hubaishan


Các câu trả lời:


SQLite3 hỗ trợ toán tử REGEXP:

WHERE x REGEXP <regex>

54
2018-02-21 21:51



Tôi tìm thấy một cách dễ dàng: Nó chỉ đơn giản là \ bx \ b trong đó x là giá trị cần tìm trong chuỗi :) - cody
@ Dan: Làm thế nào để bạn thêm một regex() chức năng để hỗ trợ REGEXP nhà điều hành? Theo mặc định, một chức năng người dùng chưa được thêm vào. - SK9
Theo các tài liệu Sqlite: Toán tử REGEXP là một cú pháp đặc biệt cho hàm người dùng regexp (). Không có hàm regexp () nào được định nghĩa theo mặc định và do đó việc sử dụng toán tử REGEXP thường sẽ dẫn đến một thông báo lỗi. Nếu một hàm SQL do ứng dụng định nghĩa có tên là "regexp" được thêm vào lúc chạy, hàm đó sẽ được gọi để thực hiện toán tử REGEXP. (sqlite.org/lang_expr.html#regexp) - radicand
Đối với những người trong chúng ta gặp lỗi khi bạn thử điều này, hãy xem câu trả lời bên dưới stackoverflow.com/a/18484596/1585572 Tôi đặt mã trong một tệp và nhập nó vào các hàm do người dùng định nghĩa trong trình quản lý sqlite Firefox của tôi. Bạn cần phải gọi nó hơi khác một chút, như thế này: SELECT * FROM table WHERE column regexp ("myregexp") - Tristan


Như những người khác đã chỉ ra, REGEXP gọi một hàm do người dùng định nghĩa mà trước tiên phải được định nghĩa và được nạp vào cơ sở dữ liệu. Có lẽ một số phân phối sqlite hoặc các công cụ GUI bao gồm nó theo mặc định, nhưng cài đặt Ubuntu của tôi thì không. Giải pháp là

sudo apt-get install sqlite3-pcre

thực hiện các biểu thức chính quy Perl trong mô-đun có thể nạp được /usr/lib/sqlite3/pcre.so

Để có thể sử dụng nó, bạn phải tải nó mỗi khi bạn mở cơ sở dữ liệu:

.load /usr/lib/sqlite3/pcre.so

Hoặc bạn có thể đặt dòng đó vào ~/.sqliterc.

Bây giờ bạn có thể truy vấn như thế này:

SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';

Nếu bạn đang ở trên Windows, tôi đoán một tập tin .dll tương tự nên có sẵn ở đâu đó.


87
2017-12-01 08:41



Một tùy chọn tải khác: Tôi tạo ra một khung nhìn với điều này: SELECT load_extension ('/ usr / lib / sqlite3 / pcre.so'); Bằng cách đó, khi tôi sử dụng một điểm vào dựa trên GUI cho DB (như SQLite Manager trong Firefox), tôi có một cách để nạp khả năng REGEXP. - Paulb


Một cách hacky để giải quyết nó mà không có regex là where ',' || x || ',' like '%,3,%'


27
2018-02-21 21:56



Có, tôi nghĩ theo cách đó, nhưng không có hàng đầu hoặc sau "," mọi lúc. Dù sao cũng cảm ơn bạn :-) - cody
@cody, đó là lý do tôi thêm dấu phẩy vào x trước khi thử nghiệm - nó sẽ hoạt động .. - Blorgbeard
Ah ... tôi hiểu ... có thể còn tốt hơn cả một regex trong trường hợp này! Tuyệt quá! Cám ơn - cody
Tôi đã không vấp ngã khi vấn đề ở đây - Tôi tự hỏi nếu điều này hoạt động như x là tên cột ... - cody
Bạn nên sử dụng ',' || x || ',' - baruch


SQLite không chứa chức năng biểu thức chính quy theo mặc định.

Nó định nghĩa một REGEXP toán tử, nhưng điều này sẽ thất bại với một thông báo lỗi trừ khi bạn hoặc khung công tác của bạn xác định hàm người dùng gọi là regexp(). Làm thế nào bạn làm điều này sẽ phụ thuộc vào nền tảng của bạn.

Nếu bạn có một regexp() hàm được xác định, bạn có thể khớp một số nguyên tùy ý từ danh sách được phân cách bằng dấu phẩy như sau:

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

Nhưng thực sự, có vẻ như bạn sẽ tìm thấy mọi thứ dễ dàng hơn nhiều nếu bạn chuẩn hóa cấu trúc cơ sở dữ liệu của bạn bằng cách thay thế những nhóm trong một cột với một hàng riêng biệt cho mỗi số trong danh sách được phân cách bằng dấu phẩy. Sau đó, bạn không chỉ có thể sử dụng = toán tử thay vì biểu thức chính quy, nhưng cũng sử dụng các công cụ quan hệ mạnh mẽ hơn như các phép nối mà SQL cung cấp cho bạn.


17
2017-11-23 15:24





Một UDF SQLite trong PHP / PDO cho REGEXP từ khóa bắt chước hành vi trong MySQL:

$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;
    }
);

Các u sửa đổi không được thực hiện trong MySQL, nhưng tôi thấy nó hữu ích để có nó theo mặc định. Ví dụ:

SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');

Nếu một trong hai $data hoặc là $pattern là NULL, kết quả là NULL - giống như trong MySQL.


10
2017-08-28 09:50





Tôi không trả lời một câu hỏi đã được đăng gần một năm trước. Nhưng tôi viết điều này cho những người nghĩ rằng chính Sqlite cung cấp chức năng REGEXP.

Một yêu cầu cơ bản để gọi hàm REGEXP trong sqlite là
"Bạn nên tạo chức năng của riêng bạn trong ứng dụng và sau đó cung cấp liên kết gọi lại đến trình điều khiển sqlite".
Cho rằng bạn phải sử dụng sqlite_create_function (giao diện C). Bạn có thể tìm thấy chi tiết từ đây và đây


3
2017-11-09 05:18





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

Và:

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'

3
2018-06-30 14:19





Bạn có thể sử dụng cụm từ thông dụng với REGEXP, nhưng đó là một cách ngớ ngẩn để thực hiện một trận đấu chính xác.

Bạn chỉ nên nói WHERE x = '3'.


2
2018-02-21 21:47



Tôi nên giải thích nó tốt hơn (xin lỗi vì tiếng anh nghèo của tôi), tôi có nghĩa là chỉ có một giá trị chính xác nhất định, không phải là chuỗi chính xác. Dù sao cũng cảm ơn bạn! - cody


Cân nhắc việc sử dụng

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

Điều này sẽ khớp chính xác 3 khi x là:

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

Những ví dụ khác:

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

Điều này sẽ khớp với 3 hoặc 13


2
2017-10-27 11:43