有没有办法可以构建一个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
答案 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
所有行,其中id
是service
表的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"范围。
这将使加入更容易。