2017-04-13 83 views
1

有什麼方法可以找出查詢返回的兩個或多個記錄中不具有相同值的列名稱? 我在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 

我如何比較上述三個記錄,並找出哪些列具有不同的價值? (在這種情況下是第4列)。在我的原始數據庫中,我有超過25列,並且在任何有差異的地方我都需要所有列名。

注意:查詢結果以數組形式返回,每列可以使用records[i].column_name訪問。

此外,我需要得到這個與ActiveRecord作爲包裝Ruby的工作。我認爲這可以使用大量的嵌套if/else來完成,但必須有一個優雅的解決方案。

我該怎麼做?

+0

篩選具有多個唯一值的所有列。 – emaillenin

+0

你使用什麼數據庫? –

+0

數據庫是PostgreSQL –

回答

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 } 
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 
相關問題