为什么当 pgadmin returns 我期望的一切时,我只从 rails 中的 psql 查询得到一个结果?

Why do I only get one result from psql query in rails when pgadmin returns everything I expect?

select sum(table_3.col_1) as number,
(CASE
    when table_1.line_1 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_1, '(?i)City\s*(\d+)'))[1])
    when table_1.line_2 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_2, '(?i)City\s*(\d+)'))[1])
    when table_1.line_3 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_3, '(?i)City\s*(\d+)'))[1])
    when table_1.line_4 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_4, '(?i)City\s*(\d+)'))[1])
    when table_1.line_5 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_5, '(?i)City\s*(\d+)'))[1])
    when table_1.line_6 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_6, '(?i)City\s*(\d+)'))[1])
    when table_1.line_7 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_7, '(?i)City\s*(\d+)'))[1])
    when table_1.line_8 ~* '(?i)City\s*(\d+)' then 'C' || (select (regexp_matches(table_1.line_8, '(?i)City\s*(\d+)'))[1])
    else 'City'::varchar
 end
) as string_result
from table_1
join table_2 on table_1.id = table_2.table_1_id
join table_3 on table_2.id = table_3.table_2_id
join table_4 on table_3.table_4_id = table_4.id
where table_4.id = 2
group by string_result

当我在 pgadmin 中 运行 上面的查询时,我得到了我期望的所有信息。超过 20 行。但是当我 运行 在 rails 中使用 heredoc 和 ActiveRecord::Base.connection.execute(sql) 时,我只返回最后一行。我在其他项目中完成了几乎完全相同的事情(当然是不同的数据)并取得了巨大成功。我不知道为什么当 运行 in Rails

时这里只返回一行

更新:我能够弄清楚为什么会发生这种情况,但在纠正它时仍然遇到问题。问题是,当查询传递到 ActiveRecord::Base.connection.execute(sql) 时,它正在转义我的正则表达式的 space 和数字要求。我仍在浏览 postgres 模式匹配文档,但目前我很难使用正则表达式,因为我对使用它们还是很陌生。但我正在尝试捕获字符串中的数字,如 'City 24' 与 City case insensitvely

匹配

您无法访问数组等结果。需要使用each方法。

示例:

ActiveRecord::Base.connection.execute(sql).each |row|
  p row
end

你能做的是

ActiveRecord::Base.connection.select_all

这将为您return 一组结果。

出于某种原因,PostgreSQL 的结果不是数组,而其他数据库 return 数组。这些都应该有效。

我终于开始思考正则表达式了。我终于能够解决我的问题。这是数字捕获。它在 (\d+) 的 pgadmin 中工作,但是当通过 ActiveRecord::Base.connections.execute(sql) 时,由于某种原因它没有工作。解决办法是给它一个 [0-9] 的范围,因为 + 只是一个或多个,所以我给它 {1,2}。所以现在正则表达式是 (?i)City\s*([0-9]{1,2}) 这将不区分大小写地匹配 'City' 后跟任意数量的空格的字符串。之后将获取前两位数字。