为什么当 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'
后跟任意数量的空格的字符串。之后将获取前两位数字。
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'
后跟任意数量的空格的字符串。之后将获取前两位数字。