Postgresql JSON数据列上的Distinct

尝试在rails的模式下执行distinct

2.1.1:450>u、 profiles.select(“profiles.*”).distinct
配置文件加载(0.9ms)选择不同的配置文件。*从“配置文件”上的“配置文件”内部连接“集成配置文件”。“id”=“集成配置文件”。“集成配置文件”上的“配置文件id”内部连接“集成”。“集成id”中的“集成”。“用户id”=“1[[“用户id”,2]]
PG::UndefinedFunction:错误:无法识别json类型的相等运算符
第1行:选择不同的配置文件。*从“配置文件”内部连接“集成…”。。。
^
:选择不同的配置文件。*从“配置文件”上的“配置文件”内部连接“集成配置文件”。“id”=“集成配置文件”。“集成配置文件”上的“配置文件id”内部连接“集成”。“集成id”中的“集成”。“用户id”=$1
ActiveRecord::StatementInvalid:PG::UndefinedFunction:错误:无法识别json类型的相等运算符
第1行:选择不同的配置文件。*从“配置文件”内部连接“集成…”。。。
^
:选择不同的配置文件。*从“配置文件”上的“配置文件”内部连接“集成配置文件”。“id”=“集成配置文件”。“集成配置文件”上的“配置文件id”内部连接“集成”。“集成id”中的“集成”。“用户id”=$1
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/rack-mini-profiler-0.9.1/lib/patches/sql_patches.rb:109:in“prepare”
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/rack-mini-profiler-0.9.1/lib/patches/sql_patches.rb:109:in“prepare”
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/postgresql\u adapter.rb:834:在“prepare\u语句”中
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/postgresql\u adapter.rb:795:“exec\u缓存”中
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/postgresql/database\u statements.rb:139:in`block in exec\u query'
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/abstract\u adapter.rb:442:in“block in log”
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activesupport-4.0.4/lib/active\u support/notifications/instrumenter.rb:20:in'instrument'
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/abstract\u adapter.rb:437:在“日志”中
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/postgresql/database\u statements.rb:137:in'exec\u query'
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/postgresql\u adapter.rb:908:在“选择”中
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/abstract/database\u statements.rb:32:在“全选”中
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/connection\u adapters/abstract/query\u cache.rb:63:在“全选”中
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/querying.rb:36:“按sql查找”
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/relation.rb:585:in'exec\u querys'
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/association\u relation.rb:15:in'exec\u querys'
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/relation.rb:471:in'load'
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/relation.rb:220:in'to\u a'
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active\u record/relation.rb:573:in'inspect'
from/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/railties-4.0.4/lib/rails/commands/console.rb:90:in'start'
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/railties-4.0.4/lib/rails/commands/console.rb:9:in'start'
来自/Users/mmahalwy/.rvm/gems/ruby-2.1.1/gems/railties-4.0.4/lib/rails/commands.rb:62:in`<顶部(必需)>'
从箱子/轨道:4:in“require”
从箱子/轨道:4:in`<主>'2.1.1:451>

获取错误PG::UndefinedFunction:错误:无法识别json类型的相等运算符

在这种情况下,转换为Hstore不是我的选择。有什么解决办法吗

这背后的原因是,在PostgreSQL(9.3之前)中,没有为json定义相等运算符(即val1::json=val2::json将始终引发此异常)——在9.4中,将为jsonb类型定义一个相等运算符

一种解决方法是,您可以将json字段强制转换为text。但这并不能涵盖所有的json均衡。f、 前{a:1,“b:2}应等于{b:2,“a:1},但如果强制转换为文本,则不等于

另一个解决方法是(如果您有该表的主键——应该是主键),您可以使用(<expressions>)上的DISTINCT表单:

u.profiles.选择(“在(profiles.id)profiles.*上有区别”)

注意事项:关于的一个已知警告:

DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。ORDER BY子句通常包含其他表达式,这些表达式确定每个DISTINCT ON组中所需的行优先级

发表评论