PostgreSQL во всех случаях выходил из бокового выхода - PullRequest
0 голосов
/ 09 мая 2019
CREATE TABLE public.temp (
    a text COLLATE pg_catalog."default",
    b text COLLATE pg_catalog."default",
    c text COLLATE pg_catalog."default",
    d text COLLATE pg_catalog."default",
    e numeric,
    pkey bigint NOT NULL,
    CONSTRAINT pkey_temp PRIMARY KEY (pkey) )

INSERT INTO public.temp(a, b, c, d, e, pkey)    VALUES
  ('xwlnormingoohlzr','some_value','tebwdlajnzypccgk','nnakygtgpvqxuayg',3276,1),
  ('bnlmykbfdexbrcwj','some_value','zxjlszfazsxpllcp','onlaqqddbsxnogyh',3360,2),
  ('hvjvlsyacstdlvog','some_value','xsznhgrjzhlxvspt','vosoulnvdxbfffer',62,3),
  ('zmgriuziltpbwfys','some_value','nzgnseflbvxcdqev','jefyxrdowtnwznve',1833,4),
  ('ziwhqxbcmbwjduji','some_value','gjiazbxnvkccusxe','wlgmphvqvapvflzi',3936,5),
  ('ldojloaothuwhsky','some_value','onpgbjkjwrjvdisw','ajpmkoshzcvqdsxp',3416,6),
  ('edtgbaqmpvfxqadz','other_value','ostuffegobykyiaf','gommhuppohcypppr',2754,7),
  ('vometxuiataxjdrd','other_value','zvwcularbgyiyrar','hdnamfmjkicgufxk',462,8),
  ('cqbpxyyiklhdvxcd','other_value','qrlvjmkijqohuvnb','hphrmykukcaoqmjy',63,9),
  ('mqwwnemddwynulwy','other_value','plbgdjniyqkzwxwm','waszvkkpinnjofet',59,10),
  ('zehtxhonbrfiiksw','other_value','oaowphudhtaupisp','ezgwzyiolgtehpou',920,11),
  ('ylhzfkyyxvdkftdk','other_value','kknyczaiihxacqjd','tzafbxojawhznmir',2528,12),
  ('dhlnmexaovbivudl','other_value','xbwqogpxaqssqjee','qecclksfpnbtugli',224,13);

Я хочу продублировать некоторые строки, которые соответствуют некоторым условиям, как указано ниже:

select
    b,
    the_value
from public.temp
    left join lateral 
        unnest(array[-e,e]) as the_value
        on b = 'some_value'

Для b = 'some_value' я хотел бы продублировать строки с одним выводом e, другим-e;и для b = "other_value", хотите вывести e.

Приведенный выше запрос дает null, когда b не 'some_value'.Я понимаю, что это ожидаемое поведение, но как вывести что-либо во всех случаях?

В настоящее время я получаю:

"some_value"    "-3276"
"some_value"    "3276"
"some_value"    "-3360"
"some_value"    "3360"
"some_value"    "-62"
"some_value"    "62"
"some_value"    "-1833"
"some_value"    "1833"
"some_value"    "-3936"
"some_value"    "3936"
"some_value"    "-3416"
"some_value"    "3416"
"other_value"   
"other_value"   
"other_value"   
"other_value"   
"other_value"   
"other_value"   
"other_value"   

И я хотел бы увидеть:

"some_value"    "-3276"
"some_value"    "3276"
"some_value"    "-3360"
"some_value"    "3360"
"some_value"    "-62"
"some_value"    "62"
"some_value"    "-1833"
"some_value"    "1833"
"some_value"    "-3936"
"some_value"    "3936"
"some_value"    "-3416"
"some_value"    "3416"
"other_value"   "2754"
"other_value"   "462"
"other_value"   "63"
"other_value"   "59"
"other_value"   "920"
"other_value"   "2528"
"other_value"   "224"

1 Ответ

0 голосов
/ 09 мая 2019

Вы можете просто сделать это:

  select b,unnest(CASE WHEN b='some_value' then array[-e,e] else array[e] end)  from public.temp

Это вернет ожидаемый результат

...