Postgre SQL мин / макс внутри предложения THEN - PullRequest
1 голос
/ 20 апреля 2020

Вот мой код:

INSERT INTO salaries (num)
SELECT
CASE random()<0.5 WHEN true THEN min(8+floor(random()*4),10))
WHEN false THEN max(8-floor(random()*4),1)) END AS num
FROM generate_series(1,1) as seq(my_id);

возвращает эту ошибку:

LINE 3: CASE random() < 0.5 WHEN true THEN (SELECT min(8+floor(rando...
                                                   ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Не могли бы вы дать мне подсказку или я что-то не так делаю?

1 Ответ

0 голосов
/ 20 апреля 2020

Ваша непосредственная проблема в том, что вам нужно least() и greatst() вместо min() и max() - последние являются агрегатными функциями, которые работают над наборами, а не над списком значений.

Но я также думаю, что ваш запрос не делает то, что вы хотите. random() пересчитывается при каждом вызове. Предположительно, вам нужно постоянное значение в выражении case, поэтому что-то вроде:

insert into salaries (num)
select case when rnd < 0.5  
    then least(8 + floor(rnd * 4), 10)
    else greatest(8 - floor(rnd * 4), 1) 
end 
from (select my_id, random() rnd from generate_series(1,1) as seq(my_id)) t

Это Все еще Неясно, для чего предназначен generate_series() запрос, но я Предполагается, что это побочный эффект упрощенного запроса ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...