PostgreSQL/不使用消除的 SELECT
外觀
使用布林條件來縮小一組資料而不消除所有可能的結果,這是 SQL 中常見的難題。在這個例子中,你想要找到最佳匹配,如果可以的話,或者NULL. 這可以透過關係型資料庫輕鬆乾淨地實現,方法是稍微濫用一下UNION ALL。有很多方法可以用過程化的方式來實現,例如模糊匹配。[1]
基本思路是SELECT *,不消除任何內容,UNION ALL到同一個集合上的另一個SELECT(不同的例項),這樣就有可能在 UNION 的集合中消除元組。然後你會count()所有元組的出現次數,每個元組至少出現一次(第一個UNION ALL的 LHS),這將不會導致任何消除。對於這個結果集,你將選擇count()的max()。
db=# select * from foo;
bar ----- 5 4 3 6 (4 rows)
SELECT count(foo.bar), bar
FROM (
SELECT *
FROM foo
UNION ALL
SELECT *
FROM foo
WHERE bar = 4 -- Conditional that will not eliminate
)
AS foo
GROUP BY bar
;
這裡關鍵的是,如果使用了條件bar = 50,你仍然會得到原始資料集。
count | bar
-------+-----
1 | 5
2 | 4
1 | 3
1 | 6
(3 rows)
第三方資料提供商給了你一組資料,你希望從中選擇最佳匹配。你配備了一些可能幫助你識別最佳匹配的東西,但你希望始終返回一個元組,也就是說你永遠不想消除所有返回的元組。你的資料應該只裁剪掉多餘的匹配項。
例如,我們使用一個 vin1GCEC14C57Z590788:
- 他們稱修剪為 "Work Truck",你稱修剪為 "1WT"。
你不想因為這一點而消除所有車輛。因此,這裡使用條件trim LIKE '%1WT%'將不起作用,因為 "Work Truck" 中不包含 "1WT"。
現在假設其他提供的資訊將幫助你更好地識別你的車輛與哪種風格相匹配。就像 "MSRP" 的情況一樣,如果它在 18,123 的 1.00 美元範圍內,你就可以成功地消除除一種風格之外的所有風格。
觀察我們可以做到這一點的一種方法
- ^ 模糊匹配通常使用簡單的萊文斯坦編輯距離公式。使用 plperl(Perl),你可以使用
String::Approx模組的adist()輕鬆地實現這一點。