SQL从包含逗号分隔键的字段中选择

时间:2016-09-07 08:35:25

标签: sql

有没有办法可以构建一个SQL语句来帮助我根据状态检索活动记录,然后引用存储在另一个字段中的oldids?

假设我想将下面的数据加入到另一个表中。对于ID = 4,它意味着组合ID 1,3和4,幸存记录为4.

因此,当我想将其与另一个表连接时,如何将scvid 104链接到ID 1,3和4的事务?

select * 
from tbl 
where scvid in (id, oldids)?

示例数据:

scvid    id    oldid    status
------------------------------
101      1     NULL        0
102      2     NULL        1
103      3     NULL        0
104      4     [1,3]       1

3 个答案:

答案 0 :(得分:0)

你没有提到你的数据库系统。这是SQL Server(TSQL)的解决方案。您也可以在另一个有轻微更改的RDBMS中使用它

SELECT 
    t1.*, t2.scvid as NEWID 
FROM 
    tbl t1
JOIN 
    tbl t2 ON
    -- first case: if the record is main with [1,3] we link it to the the self 
    (t1.scvid = t2.scvid) AND (t2.oldid IS NOT NULL)
    OR 
    -- second case: we bulid ",1,3," from "[1,3]" 
    -- then we get condition ",1,3," LIKE "%,id,%" 
    -- for the id = 1 and 3 it's TRUE
    (REPLACE(REPLACE(t2.oldid,'[',','),']',',') 
        LIKE '%,'+CAST(t1.id as VARCHAR(100))+',%') 
    AND (t1.oldid IS NULL)

结果:

scvid   id  oldid   status  NEWID
101 1   NULL    0           104
103 3   NULL    0           104
104 4   [1,3]   1           104

为此记录中的旧NEWID输出新列Id,以便您可以以其他方式加入或使用它。

答案 1 :(得分:0)

对于Postgres,您可以通过将逗号分隔列表转换为数组来完成此操作。

这样的事情:

样本设置:

create table some_table (id integer);
insert into some_table values (4), (6), (8);

create table service (svcid integer, id integer, oldid text, status integer);
insert into service
values
(101, 1, NULL , 0),
(102, 2, NULL , 1),
(103, 3, NULL , 0),
(104, 4, '1,3', 1);

要获取some_table id所有行,其中idservice表的oldid列,或select * from some_table st join ( select svcid, id, oldid, status, string_to_array(s.oldid, ',')::int[]||id as all_ids from service s ) s on st.id = any(s.all_ids) 列中的任何一列可以使用:

id | svcid | id | oldid | status | all_ids
---+-------+----+-------+--------+--------
 4 |   104 |  4 | 1,3   |      1 | {1,3,4}

返回:

.col-sm-12

答案 2 :(得分:0)

这适用于SQL Server 由于LIKE语法支持负字符类[^0-9]

select 
old.scvid as old_scvid, old.id as old_id, 
new.scvid as new_scvid, new.id as new_id, new.oldid as new_oldids
from tbl new
left join tbl old 
  on (old.status = 0 and new.oldid like concat('%[^0-9]',old.id,'[^0-9]%'))
  where new.status = 1 
  and new.oldid is not null

糟糕的是表格没有" newid"字段,而不是那个" oldid"范围。
这将使加入更容易。