這是我的問題。假設我有一個名爲persons
的表格,其中包含人名和國家標識號的字段,其中後者是可選的。每個實際的人可以有多行。PostgreSQL:用於確定不同行的自定義邏輯?
現在假設我想爲每個實際的人選擇一行。對於應用程序而言,如果a)它們的ID號匹配,或者b)它們的名稱匹配且一個或兩個的ID號爲NULL,則認爲兩行是指同一個人。 SELECT DISTINCT在這裏不好:我不能做DISTINCT ON (name, id)
,因爲那麼兩個具有相同名稱且ID爲1的行不匹配(這是不正確的,它們應該被認爲是相同的)。我不能做一個DISTINCT ON (name)
,因爲然後具有相同名稱但不同ID的行將匹配(再次不正確,它們應該被認爲是不同的)。我不能做DISTINCT ON (id)
,因爲那麼ID爲NULL的所有行都被認爲是相同的(顯然不正確)。
有什麼辦法可以重新定義PostgreSQL比較行的方式來判斷它們是否相同?我猜DISTINCT ON (name, id)
的默認行爲應該是IF a.name = b.name AND a.id = b.id THEN IDENTICAL ELSE DISTINCT
。我想重新定義它,如IF a.id = b.id OR (a.name = b.name AND (a.id IS NULL OR b.id IS NULL)) THEN IDENTICAL ELSE DISTINCT
。
這很晚了,我可能錯過了一些明顯的東西,所以關於如何實現我想要的其他建議也是受歡迎的。任何使我能夠根據比簡單的列列表更復雜的標準來選擇不同的行。提前致謝。
感謝您的建議。但是,我在PostgreSQL 8.1上,AFAIK沒有窗口函數。 – Indrek 2010-08-29 13:55:42
不要以爲你需要的窗口功能: ... UNION ALL 選擇不同的名稱,從人 其中id是不是空 – Corey 2010-08-29 14:24:26
@Corey ID,即以下對'失敗(姓名,身份證)代表同一個人的元組* *:'('Bob Jones',123)','('Robert A. Jones',123)'。 – pilcrow 2010-08-29 15:23:42