A configuração é um Debian 8 com Postgres 9.4 (64 bits se isso importa).
Dada a tabela a seguir, quero "pesquisar" uma combinação de colunas first
e colunas sub
e substituir sua saída por outra string.
CREATE TABLE public.rawdata (
first integer,
sub character varying COLLATE pg_catalog."default",
value integer
)
Dados de exemplo:
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');
Por exemplo, as duas colunas '1' e 'A' devem ser lidas na saída como 'cat'.
Não deve haver alteração dos dados de origem.
Eu li sobre como usar WITH
para isso, mas não tenho certeza de como unir as colunas para que eu possa converter '(1, A)' para 'cat' e '(2, A)' para 'dog'.
Eu só preciso da saída onde eu tenho um "nome de substituição" definido.
O resultado final deve ficar assim:
Name Value
Cat 5994
Dog 30522
Infelizmente, estou limitado a fornecer a saída dessa maneira (se possível).
Normalmente, eu escreveria algo como:
select * from rawdata where first < 3
1 "A" 5994
1 "B" 28525
1 "C" 18577
2 "A" 30522
2 "B" 5238
2 "C" 18268
Mas o próximo passo é algo que não consigo descobrir.
Crie uma tabela de tradução, vamos chamá-la de
sub1_dict
:Insira todas as traduções definidas nesta tabela.
Desde que você especificou:
... use an
[INNER] JOIN
na consulta, excluindo linhas sem tradução:O PK adicionado deve servir ao seu propósito. A
INCLUDE
cláusula requer Postgres 11 . A intenção é permitir varreduras rápidas somente de índice - não é importante com tabelas pequenas.O mesmo para sua tabela
rawdata
: se for grande, adicione um índice em(first, sub)
. Ou um PK ouUNIQUE
restrição. Colunafirst
primeiro para também servir a suaWHERE
cláusula de forma otimizada. Ver:Se você obtiver varreduras somente de índice, considere outro índice de cobertura como acima,
INCLUDE (name)
no Postgres 11 ou posterior.