有没有办法找出查询返回的两个或多个记录中没有相同值的列名? 我在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
来完成,但必须有一个优雅的解决方案。
我该怎么做?
答案 0 :(得分:0)
您可能会在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 }
答案 1 :(得分:0)
如果你不介意使用ruby而不是sql,你可以这样做
relation = Table.where(:column_1 => "thing")
relation_size = relation.count
Table.column_names.select do |column_name|
relation.pluck(column_name).uniq.size != relation_size
end