如何在类似 PostgreSQL 的查询中正确转义双引号?
How do I properly escape double quotes in a PostgreSQL like query?
我有一个 PostgreSQL table,YAML 数据存储在文本字段中。
我正在尝试查找键从 false 更改为 true 的所有实例。
audited_changes: {"hide_on_map"=>[false, true]}
我可以通过对属性 hide_on_map
的类似查询轻松找到此键的所有实例
[3] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, 'hide_on_map')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(245.8ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%hide\_on\_map%') [["auditable_type", "Lot"]]
=> 1710
但是,添加双引号会破坏此
[4] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, '"hide_on_map"')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(238.5ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%"hide\_on\_map"%') [["auditable_type", "Lot"]]
=> 0
更不用说全查询了
[5] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, '"hide_on_map"=>[false, true]')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(245.0ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%"hide\_on\_map"=>[false, true]%') [["auditable_type", "Lot"]]
=> 0
开始陷入转换为 JSONB 的困境,但这增加了一些我不想解决的额外复杂问题。关于正确形成的 LIKE 子句的建议?
对于那些询问的人,直接在 SQL 中的 psql 提示符中提供此查询的两个示例。
select count(*) from audits where audited_changes like '%"hide\_on\_map"%';
select count(*) from audits where audited_changes like '%\"hide\_on\_map\"%';
两者都产生了 0 个结果。
问题是在 YAML 中没有唯一的方式来表达该数据:
hide_on_map:
- no
- yes
"hide_on_map": [false, true]
都是您数据的有效 YAML 表示。
我担心您无法避免使用某些本机类型,或者至少是“压缩”JSON 文本(字面上包含 '"hide_on_map":[false,true]'
.
我有一个 PostgreSQL table,YAML 数据存储在文本字段中。
我正在尝试查找键从 false 更改为 true 的所有实例。
audited_changes: {"hide_on_map"=>[false, true]}
我可以通过对属性 hide_on_map
的类似查询轻松找到此键的所有实例 [3] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, 'hide_on_map')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(245.8ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%hide\_on\_map%') [["auditable_type", "Lot"]]
=> 1710
但是,添加双引号会破坏此
[4] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, '"hide_on_map"')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(238.5ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%"hide\_on\_map"%') [["auditable_type", "Lot"]]
=> 0
更不用说全查询了
[5] pry(main)> like_query = ActiveRecord::Base.send(:sanitize_sql_like, '"hide_on_map"=>[false, true]')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%").count
(245.0ms) SELECT COUNT(*) FROM "audits" WHERE "audits"."auditable_type" = AND (audited_changes like '%"hide\_on\_map"=>[false, true]%') [["auditable_type", "Lot"]]
=> 0
开始陷入转换为 JSONB 的困境,但这增加了一些我不想解决的额外复杂问题。关于正确形成的 LIKE 子句的建议?
对于那些询问的人,直接在 SQL 中的 psql 提示符中提供此查询的两个示例。
select count(*) from audits where audited_changes like '%"hide\_on\_map"%';
select count(*) from audits where audited_changes like '%\"hide\_on\_map\"%';
两者都产生了 0 个结果。
问题是在 YAML 中没有唯一的方式来表达该数据:
hide_on_map:
- no
- yes
"hide_on_map": [false, true]
都是您数据的有效 YAML 表示。
我担心您无法避免使用某些本机类型,或者至少是“压缩”JSON 文本(字面上包含 '"hide_on_map":[false,true]'
.