2017-04-25 1 views
0

私はこのようなテーブルがあります。私はこの2つのテーブルにSQL Serverが

表に入社構築

Rule | Mask  |Replacement 
--------------------------------- 
@ # 12 | @   |[^0-9] 
@ # 12 | #   |[0-9] 

を1

Mask_ID | Mask  |Replacement 
--------------------------------- 
1  | @   |[^0-9] 
2  | #   |[0-9] 

表2

Rule_ID | Rule 
-------------- 
1  | @ # 12 

私が望む結果がこれです:私はこれを行うには、ボタンをREPLACE使用しようとしてきたが、私はこれだけの結果私は

Rule | Expression 
-------------------- 
@ # 12 | [^0-9] # 12 
@ # 12 | @ [0-9] 12 

を生成することができました

Rule | Expression 
-------------------- 
@ # 12 | [^0-9] [0-9] 12 

REPLACE関数を使用して複数の行を1つの行に適用する方法が不明です。誰かが何か提案があれば、私はそれを感謝します。

これは私がこれまで持っているものですが、その私は、上記の結果を取得させる:あなたの与えられたサンプルデータの場合

SELECT 
    A.PointMask_CODE 
    ,B.PointMasking_Rule_CODE 
    ,B.Mask 
    ,B.Escape_Character 
    ,B.EscapedMaskRule 
    ,REPLACE(A.PointMask_CODE, B.Mask, B.EscapedMaskRule) 
FROM 
tblStatusPointMasks_CORE A 
LEFT JOIN 
vwAORs_Status_PointMasks_EscapedRules B 
ON 
PointMask_CODE LIKE '%' + B.EscapedMask + '%' ESCAPE ISNULL(B.Escape_Character, '\') 

enter image description here

+0

これは、リレーショナル設計ではありません。だからあなたはそれに非常に苦労しています。ルール列にシンボルの配列/リストを効果的に埋め込み、それをテーブル結合に投影しようとしています。配列とリストを列に埋め込むことは、First Normal Formに違反します。 – RBarryYoung

答えて

3

を、あなたは再帰的common table expression (cte)を使用することができます。

create table masks (mask_id int, mask varchar(32), replacement varchar(32)); 
insert into masks values 
(1, '@', '[^0-9]') 
,(2, '#', '[0-9]'); 

create table rules (rule_id int, rule_txt varchar(32)); 
insert into rules values 
(1, '@ # 12'); 

with cte as (
    select 
     r.rule_id 
    , r.rule_txt 
    , masks = 0 
    from rules r 
    union all 
    select 
     r.rule_id 
    , rule_txt = convert(varchar(32),replace(r.rule_txt,m.mask,m.replacement)) 
    , masks = r.masks+1 
    from masks m 
    inner join cte r 
     on r.rule_txt like '%'+m.mask+'%' 
) 
select top 1 * 
from cte 
order by masks desc 

rextesterデモ:http://rextester.com/KAV58392

リターン:

+---------+-----------------+-------+ 
| rule_id | rule_txt  | masks | 
+---------+-----------------+-------+ 
|  1 | [^0-9] [0-9] 12 |  2 | 
+---------+-----------------+-------+ 
0

つ以上のオプション、文字列操作を使用して...

create table masks (mask_id int, mask varchar(32), replacement varchar(32)); 
insert into masks values 
(1, '@', '[^0-9]') 
,(2, '#', '[0-9]'); 

create table rules (rule_id int, rule_txt varchar(32)); 
insert into rules values 
(1, '@ # @ # 12'); 

declare @Table Table (charval varchar(10)) 
declare @char varchar(10), @rule_txt varchar(50) 
select @rule_txt=rule_txt FROM rules 
while charindex(' ',@rule_txt)>0 
begin 
    select @char=substring(@rule_txt,1,charindex(' ',@rule_txt)-1) 
    FROM rules 
    insert into @Table values (@char) 
    SET @rule_txt=RIGHT(@rule_txt,(len(@rule_txt)-charindex(' ',@rule_txt))) 
END 
insert into @Table values (@rule_txt) 
select stuff((SELECT ' '+isnull(replacement,charval) 
from @Table T left join masks M on M.mask=T.charval 
    for xml path('')),1,1,'') 
drop table rules 
drop table masks