首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定范围列表是否包含指定的整数

如何确定范围列表是否包含指定的整数
EN

Stack Overflow用户
提问于 2022-05-27 10:49:20
回答 2查看 86关注 0票数 1

产品类型表包含产品类型。有些ids可能会丢失:

代码语言:javascript
复制
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逗号分隔的类型列表。

代码语言:javascript
复制
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 )可以同时包含它们。

如何处理给定类型的所有属性。查询

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-27 11:38:03

我建议使用一个类似于unnest的助手函数,它的作用范围很广。

修正函数

代码语言:javascript
复制
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和联接。

代码语言:javascript
复制
select * 
from artliik a 
join (select id, unnest_ranges(kirjeldLku) from strings) as t(id, v)
on a.liiginrlki = v;

当然,函数定义的使用是可选的。我更喜欢它,因为它是通用的和可重用的。

票数 2
EN

Stack Overflow用户

发布于 2022-05-28 06:55:32

将只在pg14上工作,因为只有pg14具有多范围数据类型。但可定制的icu校对工作在pg13中。

整理文档:https://www.postgresql.org/docs/current/collation.html

想法:创建一个多范围文本数据类型,该类型将根据数字值对数值进行排序。比如“A-21”<“A-123”。

代码语言:javascript
复制
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
);

所以

代码语言:javascript
复制
SELECT
    mulitrange_of_text (textrange ('1'::text, '11'::text)) @> '9'::text AS contain_9;

应该返回

artliik表结构保持不变,但字符串表需要稍加更改。

代码语言:javascript
复制
CREATE temp TABLE strings (
    id text PRIMARY KEY,
    kirjeldLku mulitrange_of_text
);

然后查询:

代码语言:javascript
复制
SELECT DISTINCT
    strings.id
FROM
    artliik,
    strings
WHERE
    strings.kirjeldLku @> liiginrlki::text
ORDER BY
    1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72404218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档