有没有办法找出查询返回的两个或多个记录中不具有相同值的列名? 我在 Rails 上使用 ActiveRecord。
以下代码返回多条记录(在我的例子中大于 1):
TableName.where(column_1: value)
如果上面的查询返回三个记录,我想知道是否有一种方法可以比较这三个记录并获取值不匹配或不同的列名?
例如,如果上述查询返回这些记录:
column_1 | column_2 | column_3 | column_4
----------|----------|----------|----------
value | A | B | C
value | A | B | C1
value | A | B | C2
如何比较以上三个记录,找出哪些列有不同的值? (在这种情况下为 column_4)。在我的原始数据库中,我有超过 25 个列,只要有差异,我就需要所有列名。
注意:查询结果以数组形式返回,每一列都可以使用records[i].column_name
访问。
我还需要使用 ActiveRecord 作为包装器在 Ruby 上运行它。我认为这可以使用大量嵌套的 if
/else
来完成,但必须有一个优雅的解决方案。
我该怎么做?
最佳答案
您可能会收到必要的 Ruby 列:
columns = [:column_2, :column_3, :column_4]
various_columns = []
records = TableName.where(column_1: value)
columns.each do |column|
various_columns << column if records.map(&column).uniq.count > 1
end
或者您可以使用如下查询将计数逻辑放入数据库:
SELECT
COUNT(DISTINCT column_2) AS count_column_2,
COUNT(DISTINCT column_3) AS count_column_3,
COUNT(DISTINCT column_4) AS count_column_4
FROM table_name
WHERE column_1 = value
处理该逻辑的 Ruby 代码:
columns = [:column_2, :column_3, :column_4]
selects =
columns.map do |column|
"COUNT(DISTINCT #{column}) AS count_#{column}"
end.join(", ")
record = TableName.select(selects).take(1).first
various_columns = columns.select { |column| record["count_#{column}"] > 1 }
关于ruby-on-rails - 如何获取具有不同值的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386445/