Postgresql
合併 2 列並替換為特定輸出
設置是帶有 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 或更高版本中的另一個類似上面的覆蓋索引。