產品型別表包含產品型別。一些 id 可能會丟失:
create table artliik (liiginrlki char(3) primary key);
insert into artliik values('1');
insert into artliik values('3');
insert into artliik values('4');
...
insert into artliik values('999');
屬性表包含逗號分隔的型別串列。
create table strings ( id char(100) primary key, kirjeldLku chr(200) );
insert into strings values ('item1', '1,4-5' );
insert into strings values ('item2', '1,2,3,6-9,23-44,45' );
型別可以指定為單個整數,eq 1,2,3 或范圍如 6-9 或 23-44 串列可以同時包含它們。
如何獲取給定型別的所有屬性。詢問
select id
from artliik
join strings on ','||trim(strings.kirjeldLku)||',' like '%,'||trim(artliik.liiginrlki)||',%'
僅回傳單個整數串列的日期。如何更改連接以便還回傳串列中的型別范圍,如 6-9?方程。f 串列包含 6-9,型別 6、7、8 和 9 應包含在報告中。
使用 Postgres 13。
uj5u.com熱心網友回復:
我會建議一個類似于unnest該榮譽范圍的輔助函式。
修正功能
create or replace function unnest_ranges(s text)
returns setof text language sql immutable as
$$
with t(x) as (select unnest(string_to_array(s, ',')))
select generate_series
(
split_part(x, '-', 1)::int,
case when x ~ '-' then split_part(x, '-', 2)::int else x::int end,
1
)::text
from t;
$$;
然后你可以“規范化”表strings并加入。
select *
from artliik a
join (select id, unnest_ranges(kirjeldLku) from strings) as t(id, v)
on a.liiginrlki = v;
函式定義的使用當然是可選的。我更喜歡它,因為該功能是通用且可重用的。
uj5u.com熱心網友回復:
dbfiddle.uk 演示僅適用于 pg14,因為只有 pg14 具有多范圍資料型別。但是可定制的 icu 排序規則在 pg13 中有效。
整理檔案: https ://www.postgresql.org/docs/current/collat??ion.html
想法:創建一個多范圍文本資料型別,它將根據數值對數值進行排序。比如“A-21”<“A-123”。
CREATE COLLATION testcoll_numeric (
provider = icu,
locale = '@colNumeric=yes'
);
CREATE TYPE textrange AS RANGE (
subtype = text,
multirange_type_name = mulitrange_of_text,
COLLATION = testcoll_numeric
);
所以
SELECT
mulitrange_of_text (textrange ('1'::text, '11'::text)) @> '9'::text AS contain_9;
應該回傳true。
artliik 表結構保持不變,但字串表需要稍作改動。
CREATE temp TABLE strings (
id text PRIMARY KEY,
kirjeldLku mulitrange_of_text
);
然后查詢它:
SELECT DISTINCT
strings.id
FROM
artliik,
strings
WHERE
strings.kirjeldLku @> liiginrlki::text
ORDER BY
1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482545.html
標籤:sql 数组 PostgreSQL 加入 plpgsql
下一篇:在laravel中動態連接多個表
