Postgresql

合併 2 列並替換為特定輸出

  • November 28, 2018

設置是帶有 Postgres 9.4 的 Debian 8(如果重要,則為 64 位)。

給定下表,我想“搜尋”列first和列的組合,並sub用另一個字元串替換它們的輸出。

CREATE TABLE public.rawdata (
first integer,
sub character varying COLLATE pg_catalog."default",
value integer
)

範例數據:

INSERT INTO rawdata VALUES
 ('1','A','5994'),('1','B','28525'),('1','C','18577'),
 ('2','A','30522'),('2','B','5238'),('2','C','18268'),
 ('3','A','982'),('3','B','13401'),('3','C','24158'),
 ('4','A','8544'),('4','B','31575'),('4','C','16661'),
 ('5','A','600'),('5','B','5242'),('5','C','8740'),
 ('6','A','2557'),('6','B','69'),('6','C','31572'),
 ('7','A','4212'),('7','B','26269'),('7','C','27918'),
 ('8','A','29821'),('8','B','22603'),('8','C','32578'),
 ('9','A','8027'),('9','B','13668'),('9','C','32000'),
 ('10','A','17673'),('10','B','11723'),('10','C','8937'); 

例如,兩列“1”和“A”應在輸出中讀取為“cat”。

不應更改源數據。

我已經閱讀了有關使用WITH的資訊,但我不確定如何加入列,以便我可以將“(1,A)”轉換為“貓”,將“(2,A)”轉換為“狗”。

我只需要定義了“替換名稱”的輸出。

最終結果應如下所示:

Name Value
Cat 5994
Dog 30522

可悲的是,我僅限於以這種方式提供輸出(如果可能的話)。

通常,我會寫如下內容:

select * from rawdata where first < 3

1   "A" 5994
1   "B" 28525
1   "C" 18577
2   "A" 30522
2   "B" 5238
2   "C" 18268

但下一步是我無法弄清楚的事情。

創建一個翻譯表,我們稱之為sub1_dict

CREATE TABLE sub1_dict (
  first int NOT NULL
, sub   varchar NOT NULL
, name  text NOT NULL -- find a better name than "name"
, CONSTRAINT t_pkey PRIMARY KEY (first, sub) -- INCLUDE (name) -- see below
  );

在此表中輸入所有定義的翻譯。

由於您指定:

我只需要定義了“替換名稱”的輸出

[INNER] JOIN在查詢中使用 an ,不包括沒有翻譯的行:

SELECT s.name, r.value
FROM   rawdata r
JOIN   sub1_dict d USING (first, sub)
WHERE  r.first < 3;

添加的PK應該符合您的目的。該INCLUDE子句需要 Postgres 11。目的是允許快速的僅索引掃描 - 對於小表並不重要。

您的表也一樣rawdata:如果它很大,請在(first, sub). 或PK或UNIQUE約束。列first第一也可以WHERE最佳地為您的條款服務。看:

INCLUDE (name)如果您從中獲得僅索引掃描,請考慮使用Postgres 11 或更高版本中的另一個類似上面的覆蓋索引。

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