SQL-запрос (Postgres) работает нормально, но не через ActiveRecord - PullRequest
1 голос
/ 27 марта 2012

У меня есть SQL-запрос в Postgres, который прекрасно работает с консоли / инструмента SQL, но не через RailR 'ActiveRecord (ActiveRecord :: Base.connection.execute / select_all). Я пробовал кучу вещей, таких как экранирование кавычек, вызов ActiveRecord :: Base.quote / sanitize безрезультатно - ActiveRecord возвращает пустой набор, где я проверял, что кортеж возвращается с этим запросом.

SELECT
      ... blah blah
      FROM
        ... joins joins joins
        inner join core.pat_assignments assignment on assignment.correspondent_alias_id = out_alias.id
        inner join core.pats patent on patent.id = assignment.pat_id and (select regexp_matches(patent.us_class_current, '(\w+)\/')) = '{D02}'
      where
        in_alias.id in (1987, 5004)

Забавно, что что-то возвращает, если я уберу последнюю внутреннюю строку соединения, в частности, совпадение с регулярным выражением. Так что есть что-то с:

(select regexp_matches(patent.us_class_current, '(\w+)\/')) = '{D02}'

это заставляет его подбрасывать, но я просто не могу понять, почему ... любые предложения будут с благодарностью!

1 Ответ

3 голосов
/ 27 марта 2012

Вам нужно удвоить это \, чтобы получить \w до движка регулярных выражений, а затем вам нужно удвоить каждое из них, чтобы они прошли обработку строкового литерала в Ruby.И вы должны использовать E'', чтобы избежать предупреждения.Кроме того, вам не нужен этот дополнительный SELECT, вы можете напрямую сравнить возвращаемое значение regexp_matches.Итак, что-то вроде этого должно работать:

inner join ... and regexp_matches(patent.us_class_current, E'(\\\\w+)/') = array['D02']

Нет необходимости избегать косой черты в регулярном выражении PostgreSQL, поэтому я тоже это исключил.Встраивание языка (regex) в язык (SQL PostgreSQL) внутри другого языка (Ruby) имеет тенденцию становиться немного запутанным, когда все они хотят использовать один и тот же управляющий символ.

Например, в psql этипроисходят вещи:

psql=> select regexp_matches('D03/pancakes', E'(\w+)/');
 regexp_matches 
----------------
(0 rows)

psql=> select regexp_matches('D03/pancakes', E'(\\w+)/');
 regexp_matches 
----------------
 {D03}
(1 row)

psql=> select regexp_matches('D03/pancakes', E'(\\w+)/') = array['D03'];
 ?column? 
----------
 t
(1 row)

А затем с консоли Rails:

> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\w+)/')})
   (0.5ms)  select regexp_matches('D03/pancakes', E'(\w+)/')
 => [] 
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\w+)/')})
   (1.9ms)  select regexp_matches('D03/pancakes', E'(\w+)/')
 => [] 
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\\\w+)/')})
   (0.4ms)  select regexp_matches('D03/pancakes', E'(\\w+)/')
 => [["{D03}"]] 
> ActiveRecord::Base.connection.select_rows(%q{select regexp_matches('D03/pancakes', E'(\\\\w+)/') = array['D03']})
   (1.4ms)  select regexp_matches('D03/pancakes', E'(\\w+)/') = array['D03']
 => [["t"]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...