列不像其他表中列中的任何值 - 功能
有問題的兩個表是:
完成類型
id | type ---|-------- 1 | XXX 2 | YYY
所有類型:
id | type | sub_type ---|-------|--------- 1 | XXX X | aaa 2 | XXX-Y | bbb 3 | YYY-X | ccc 4 | YYY.Y | ddd 5 | QQQ-G | fff 6 | RRR+Q | ggg
我想要的是使用to filter的
type
列。completed_types``all_types
類似的東西
SELECT type FROM all_types WHERE type NOT LIKE ANY(SELECT type FROM completed_types
。基於上表的預期輸出將是:
id | type | sub_type ---|-------|--------- 5 | QQQ-G | fff 6 | RRR+Q | ggg
但是,它似乎沒有從輸出中刪除任何結果。我嘗試將萬用字元“%”附加到子查詢的末尾:
SELECT type FROM all_types WHERE type NOT LIKE ANY(SELECT type||'%' FROM completed_types)
但這也沒有減少結果的數量。
我的計劃是在一個函式中使用它,因為它
all_types.type
可能會快速增長,但completed_types.type
會變慢,並且可能永遠不會完全相同甚至接近,所以如果這會改變你的答案,請告訴我,但是對此的任何幫助表示讚賞.
雖然您的解決方案基本上應該可以完成這項工作:
SELECT type FROM all_types WHERE type NOT LIKE ALL(SELECT type||'%' FROM completed_types)
注意一些極端情況問題:
如果
completed_types.type
未定義NOT NULL
並且您甚至引入了單個NULL
,您的查詢將不會返回任何行。所以確保它是NOT NULL
.如果
all_types.type
allowedNULL
,則永遠不會返回這些行。因此,請確保一個也是NOT NULL
如此,或者像下面這樣調整查詢。如果允許其中一個特殊字元
%\_
,您可能希望在將字元串轉換為 LIKE 模式時轉義它們的特殊含義。看:我建議(使用上面連結中概述的簡單功能
f_like_escape()
):SELECT type FROM all_types a WHERE NOT EXISTS ( SELECT FROM completed_types c WHERE a.type LIKE f_like_escape(c.type) || % );
還返回帶有
all_types.type IS NULL
- 的行,而不是原始行。或者將容易轉義的模式保存為附加列,
completed_types
以避免一遍又一遍地轉義。或者,如果
completed_types.type
始終像您的數據樣本所示那樣包含前 3 個字元:SELECT type FROM all_types a WHERE NOT EXISTS ( SELECT FROM completed_types c WHERE a.type = left(c.type, 3) );