2016-09-07 10 views
1

ステータスに基づいてアクティブなレコードを取得し、別のフィールドに格納されているoldidsへの参照に役立つSQL文を作成する方法はありますか?SQLはカンマ区切りキーを含むフィールドから選択します

以下のデータを別のテーブルに結合したいとします。 ID = 4の場合、ID1,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あなたはJOINまたは別の方法でそれを使用できるように。

0

Postgresでは、コンマ区切りのリストを配列に変換することでこれを行うことができます。 ididserviceテーブルの列またはすることができますoldid列でそれらのいずれかのいずれかであるsome_tableからすべての行を取得するには

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); 

サンプルのセットアップ:このような

何か使用:

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 

テーブルには、 "oldid"の代わりに "newid"フィールドがありません。
これは、参加が非常に簡単になります。

+0

(標準)SQLの 'LIKE'は' _'と '%'のみをワイルドカードとしてサポートしています。 「パターン」または同様の「正規表現」は、「LIKE」によってサポートされていません。 –

関連する問題