如何在类似 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]'.