다음 사용자 지정 저장 기능 -PostgreSQL 9.6 및 더 낮은 버전에서 배열을 임의로 이동하는 방법은 무엇입니까?
CREATE OR REPLACE FUNCTION words_shuffle(in_array varchar[])
RETURNS varchar[] AS
$func$
SELECT array_agg(letters.x) FROM
(SELECT UNNEST(in_array) x ORDER BY RANDOM()) letters;
$func$ LANGUAGE sql STABLE;
는 PostgreSQL의 9.5.3에 문자 배열을 셔플되었다
words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
words_shuffle
---------------
{c,d,b,a,e,f}
(1 row)
하지만 지금은 PostgreSQL을 전환 한 후에는 기능 작동이 중지 9.6.2 :
:words=> select words_shuffle(ARRAY['a','b','c','d','e','f']);
words_shuffle
---------------
{a,b,c,d,e,f}
(1 row)
아마 RANDOM BY 순서는() 작동이 중지 때문에
words=> select unnest(ARRAY['a','b','c','d','e','f']) order by random();
unnest
--------
a
b
c
d
e
f
(6 rows)
새로운 PostgreSQL 9.6 및 9.5에서도 작동하는 문자 배열을 더 잘 만드는 방법을 찾고 있습니다.
Pl/PgSQL 기능을 사용하는 my word game 개발에 필요합니다.
는UPDATE :
대답 Tom Lane에 의해 다음 TARGETLIST에 SRFs의
확장은 이제 BY ORDER 후 발생합니다. 그래서 ORDER BY는 하나의 더미 행을 정렬하고 그 다음에 unnest 이 발생합니다.
https://git.postgresql.org/gitweb/?p=postgresql.git&a=commitdiff&h=9118d03a8
'from' 절과'select'의 차이점은 실제로 이것이 작동을 멈춘 이유와 아무런 관련이 없습니다. 대답은 정확하고 정서는 정확하지만 (행 생성 함수를'from' 절에 넣음) 추론은 꺼져 있습니다. –
필자는'SELECT' 절에서 SRF를 결코 사용하지 않기 때문에 그 문제에 대해 전혀 생각 해보지 않았습니다. 질문에 설명 된 사례가 SRF의 오용으로 인한 알려진 단일 문제가 아니기 때문에 규칙을 채택해야한다고 생각합니다. – klin