WITH ORDINALITY
Postgres 9.4 이상
새로운 기능은 이러한 종류의 문제를 단순화합니다. 위의 쿼리는 이제 간단히 다음과 같습니다.
SELECT *
FROM regexp_split_to_table('I think Postgres is nifty', ' ') WITH ORDINALITY x(word, rn);
또는 테이블에 적용하십시오.
SELECT *
FROM tbl t, regexp_split_to_table(t.my_column, ' ') WITH ORDINALITY x(word, rn);
세부:
암시 적 LATERAL
조인 정보 :
Postgres 9.3 이상 및보다 일반적인 설명
단일 문자열
row_number()
요소의 순서를 기억하기 위해 창 기능 을 적용 할 수 있습니다 . 그러나 일반적으로 문자열 의 원래 위치 가 아니라 정렬 순서row_number() OVER (ORDER BY col)
에 따라 숫자를 얻습니다 .
ORDER BY
위치를 "있는 그대로" 생략 하기 만하면 됩니다.
SELECT *, row_number() OVER () AS rn
FROM regexp_split_to_table('I think Postgres is nifty', ' ') AS x(word);
regexp_split_to_table()
긴 문자열을 사용하면 성능이 저하됩니다. unnest(string_to_array(...))
더 나은 확장 성 :
SELECT *, row_number() OVER () AS rn
FROM unnest(string_to_array('I think Postgres is nifty', ' ')) AS x(word);
그러나 이것이 정상적으로 작동 하고 간단한 쿼리에서 깨지는 것을 본 적이 없지만 Postgres는 명시 적없이 행 순서에 대해서는 아무것도 주장하지 않습니다 ORDER BY
.
원래 문자열에서 요소의 서수 를 보장 하려면 generate_subscript()
(@deszo의 주석으로 개선)을 사용하십시오.
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM string_to_array('I think Postgres is nifty', ' ') AS x(arr)
) y;
문자열 표
추가 PARTITION BY id
받는 OVER
절 ...
데모 테이블 :
CREATE TEMP TABLE strings(string text);
INSERT INTO strings VALUES
('I think Postgres is nifty')
,('And it keeps getting better');
기본 키ctid
대신 임시로 사용 합니다 . 하나 (또는 고유 한 열 )가있는 경우 대신 사용하십시오.
SELECT *, row_number() OVER (PARTITION BY ctid) AS rn
FROM (
SELECT ctid, unnest(string_to_array(string, ' ')) AS word
FROM strings
) x;
이것은 별개의 ID없이 작동합니다.
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y;
SQL 바이올린.
질문에 대한 답변
SELECT z.arr, z.rn, z.word, d.meaning -- , partofspeech -- ?
FROM (
SELECT *, arr[rn] AS word
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y
) z
JOIN dictionary d ON d.wordname = z.word
ORDER BY z.arr, z.rn;