Usare le regexp nei query SQLite


Joe Yates- Pubblicato il25 settembre 2009

Spesso mi trovo in una situazione con SQLite dove mi servirebbe usare una regular expression.

Un esempio recente e' stato quando stavo implementando un sistema di autocomplete. Volevo solo quei risultati che avessero il termine cercato all'inizio di un parola.

Cioe', cercando 'all', volevo trovare 'allegato', ma non 'pallone'.

Di default in SQLite non c'e' un operatore REGEXP, o meglio, c'e' ma non e' implementato (http://www.sqlite.org/lang_expr.html#regexp).

Ho trovato un articolo che spiega come implementare l'operatore REGEXP in Ruby:

  • http://stephen-veit.blogspot.com/2009/03/implementing-regexp-in-sqlite3.html.

Purtroppo il codice nell'articolo non funzionava per incompatibilita' con l'interfaccia Rails 2.3.x per SQLite - dove  ActiveRecord::ConnectionAdapters::SQLite3Adapter.initialize() prende 3 parametri, non 2.

Per far funzionare REGEXP, ho aggiunto quanto segue nel file 'config/initializers/sqlite3_regexp.rb':

require 'active_record/connection_adapters/sqlite3_adapter'

class ActiveRecord::ConnectionAdapters::SQLite3Adapter
  def initialize(db, logger, config)
    super
    db.create_function('regexp', 2) do |func, pattern, expression|
       regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)
       if expression.to_s.match(regexp)
         func.result = 1
       else
         func.result = 0
       end
     end
  end
end