产品类型表包含产品类型。有些ids可能会丢失:
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');属性表contais逗号分隔的类型列表。
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' );类型可以指定为单个整数,e.q 1、2、3或范围(如6-9或23-44 )可以同时包含它们。
如何处理给定类型的所有属性。查询
select id
from artliik
join strings on ','||trim(strings.kirjeldLku)||',' like '%,'||trim(artliik.liiginrlki)||',%' 只返回单个整数列表的日期。如何更改join以使列表中的类型范围(如6-9 )也被返回?情商。F清单应包括6至9类、6、7、8和9类报告。
使用Postgres 13。
发布于 2022-05-27 11:38:03
我建议使用一个类似于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;当然,函数定义的使用是可选的。我更喜欢它,因为它是通用的和可重用的。
发布于 2022-05-28 06:55:32
将只在pg14上工作,因为只有pg14具有多范围数据类型。但可定制的icu校对工作在pg13中。
整理文档:https://www.postgresql.org/docs/current/collation.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;应该返回真。
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://stackoverflow.com/questions/72404218
复制相似问题