How do I use regex in a SQLite query?

后端 未结 17 1562
暖寄归人
暖寄归人 2020-11-22 05:57

I\'d like to use a regular expression in sqlite, but I don\'t know how.

My table has got a column with strings like this: \"3,12,13,14,19,28,32\" Now if I type \"whe

相关标签:
17条回答
  • 2020-11-22 06:16

    A hacky way to solve it without regex is where ',' || x || ',' like '%,3,%'

    0 讨论(0)
  • 2020-11-22 06:19

    I don't it is good to answer a question which was posted almost an year ago. But I am writing this for those who think that Sqlite itself provide the function REGEXP.

    One basic requirement to invoke the function REGEXP in sqlite is
    "You should create your own function in the application and then provide the callback link to the sqlite driver".
    For that you have to use sqlite_create_function (C interface). You can find the detail from here and here

    0 讨论(0)
  • 2020-11-22 06:19

    Consider using this

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

    This will match exactly 3 when x is in:

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

    Other examples:

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

    This will match on 3 or 13

    0 讨论(0)
  • 2020-11-22 06:20

    You could use a regular expression with REGEXP, but that is a silly way to do an exact match.

    You should just say WHERE x = '3'.

    0 讨论(0)
  • 2020-11-22 06:22

    SQLite does not contain regular expression functionality by default.

    It defines a REGEXP operator, but this will fail with an error message unless you or your framework define a user function called regexp(). How you do this will depend on your platform.

    If you have a regexp() function defined, you can match an arbitrary integer from a comma-separated list like so:

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

    But really, it looks like you would find things a whole lot easier if you normalised your database structure by replacing those groups within a single column with a separate row for each number in the comma-separated list. Then you could not only use the = operator instead of a regular expression, but also use more powerful relational tools like joins that SQL provides for you.

    0 讨论(0)
  • 2020-11-22 06:29

    As others pointed out already, REGEXP calls a user defined function which must first be defined and loaded into the the database. Maybe some sqlite distributions or GUI tools include it by default, but my Ubuntu install did not. The solution was

    sudo apt-get install sqlite3-pcre
    

    which implements Perl regular expressions in a loadable module in /usr/lib/sqlite3/pcre.so

    To be able to use it, you have to load it each time you open the database:

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

    Or you could put that line into your ~/.sqliterc.

    Now you can query like this:

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

    If you want to query directly from the command-line, you can use the -cmd switch to load the library before your SQL:

    sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"
    

    If you are on Windows, I guess a similar .dll file should be available somewhere.

    0 讨论(0)
提交回复
热议问题