在不相关列上的 Postgresql 错误中选择 Distinct

Posted

技术标签:

【中文标题】在不相关列上的 Postgresql 错误中选择 Distinct【英文标题】:Select Distinct in Postgresql erroring on unrelated column 【发布时间】:2015-08-19 22:15:15 【问题描述】:

我正在努力编写执行以下操作的 SQL 语句:获取一组用户最近完成的评估

每个用户一个(不同的user_id) 在选定的用户组中(user_id 在数组中) 仅完成评估(type_name 不为空) 包含所有字段(稍后将使用)

最近尝试:

SELECT DISTINCT(user_id), assessments.*
FROM assessments
WHERE
  user_id IN (1,2,3,4,5,10)
  AND type_name IS NOT NULL
ORDER BY
  created_at DESC,
  user_id DESC

当前错误:

无法识别 json 类型的相等运算符

开启:

assessments.*

我已经经历了很多不同版本的各种错误,但我认为这个应该可以工作,但它似乎试图根据所有列而不是 user_id 来区分。

我真的很希望它在 Rails 中工作,但由于我无法做到这一点,我想先让普通 SQL 工作。

更新

部分问题可能是我在评估中有 JSON 列。但由于我只在 user_id 上使用 distinct,它应该忽略那些 JSON 列

【问题讨论】:

【参考方案1】:

试试这个:

Assesment.uniq(:user_id)
          .where(iuser_id: [1, 2, 3])
          .where
          .not(type_name: nil)

更新:

由于问题确实存在于其他列中,因此我建议您将所有 json 列转换为 jsonb(第 9.4 页魔术)

  class AlterJsonbToJsonAndBack < ActiveRecord::Migration                      
    def up                                                                     
      change_column :assessments, :column_name, 'jsonb USING CAST(column_name AS jsonb)'  
    end                                                                        

    def down                                                                   
      change_column :assessments, :column_name, 'json USING CAST(column_name AS json)'    
    end                                                                        
  end                                                                          

how to use jsonb in rails

【讨论】:

我遇到和以前一样的错误,我会更新问题以提供更多相关数据 Rails 似乎忽略了uniq 中的论点。我也试过distinct,但它转换为的查询是:SELECT DISTINCT "assessments".* FROM "assessments" WHERE "assessments"."user_id" IN (1, 2, 3) AND ("assessments"."type_name" IS NOT NULL) ORDER BY "assessments"."created_at" DESC

以上是关于在不相关列上的 Postgresql 错误中选择 Distinct的主要内容,如果未能解决你的问题,请参考以下文章

防止 PostgreSQL 中 CIDR 列上的值重叠

PostgreSql jsonb 列上的 GIN 索引未在查询中使用

postgresql中多个列上的多个索引与单个索引

DB 列上的 Spring JPA 错误返回与列名相关的错误

如何使用 xpath 表达式在 PostgreSQL 中的 XML 列上创建索引?

如何在不使用for循环的情况下合并需要提前3个月的列上的两个数据框