2016-09-07 2 views
1

상태에 따라 활성 레코드를 검색하고 다른 필드에 저장된 oldids에 대한 참조를 찾는 데 도움이되는 SQL 문을 구성하는 방법이 있습니까?쉼표로 구분 된 키가있는 필드에서 SQL을 선택하십시오.

다른 데이터에 아래 표의 데이터를 결합하고 싶습니다. 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 
+6

쉼표로 구분 된 항목으로 데이터를 저장하지 마십시오. 그것은 단지 당신에게 많은 문제를 일으킬 것입니다. – jarlh

+2

어떤 DB를 사용하고 있습니까 (MSSQL, MySql, ....)? – valex

답변

0

당신은 당신의 DB 시스템을 언급하지 않았다. 다음은 SQL Server (TSQL) 용 솔루션입니다. 당신은 사소한 변경

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) 

결과와 다른 RDBMS도 사용할 수 있습니다 :

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

이 레코드에서 이전 Id에 대한이 출력 새 열 NEWID 당신이 가입 또는 다른 방법으로 사용할 수 있습니다.

0

Postgres의 경우 쉼표로 구분 된 목록을 배열로 변환하면됩니다. 이 같은

뭔가 :

샘플 설정하십시오 id 당신이 할 수 oldid 열에서 idservice 테이블의 열 또는 그 중 하나입니다

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에서 모든 행을 얻으려면 사용 :

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} 
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"필드가없고 "rangeid"필드 대신 "newid"필드가 없습니다.
이렇게하면 가입하기가 훨씬 쉬워집니다.

+0

(표준) SQL에서 'LIKE'는 와일드 카드로'_' 및'%'만 지원합니다. "패턴"또는 유사한 "정규 표현식"은 'LIKE'에 의해 지원되지 않습니다. –

관련 문제