Postgresql

列不像其他表中列中的任何值 - 功能

  • December 2, 2019

有問題的兩個表是:

完成類型

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.typeallowed NULL,則永遠不會返回這些行。因此,請確保一個也是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)
  );

引用自:https://dba.stackexchange.com/questions/254571