2017-08-24 2 views
0

私はこのような構造別の表に基づいてテキストを置き換える方法は?私のDBに

text: 
id | text 
1 | sample text [[[aaa]]], random text [[[bbb]]] ... [[[zzz]]]] 
n | ... 

params: 
name | value 
aaa | 111 
bbb | 222 
... | ... 
zzz | 7878778 

を持って、私は[[[]]]]各文字列ののどのように多くのブロックを知らないので、私はREGEXP_REPLACEを使用することはできません。 は、選択した後、私はこれを取得したい:

text: 
    id | text 
    1 | sample text 111, random text 222 ... 7878778 
    n | ... 

は誰がこれを助けることはできますか?

+0

、私は、喜んでいるよ:) – newSqlz

+0

は、理由だけではなく、すべての角括弧を削除しませんか? – sagi

+0

私たちはあなたの問題について何も知らない。正確に何を達成したいですか? 2つのテーブルはどのように相互作用するべきですか?あなたは何を試しましたか? – RealCheeseLord

答えて

1

このような何か:

WITH indexed_params (id, name, value, num_params) AS (
    SELECT ROWNUM, name, value, COUNT(1) OVER() FROM params 
), 
replacement (id, text, idx, num_params) AS (
    SELECT id, 
     REPLACE(text, '[[' || p.name || ']]', p.value), 
     1, 
     p.num_params 
    FROM inputs i 
     LEFT OUTER JOIN indexed_params p 
     ON (p.index = 1) 
UNION ALL 
    SELECT r.id, 
     REPLACE(r.text, '[[' || p.name || ']]', p.value), 
     r.idx+1, 
     r.num_params 
    FROM replacement r 
     INNER JOIN indexed_params p 
     ON (p.index = r.idx+1) 
    WHERE r.idx < r.num_params 
) 
SELECT id, text 
FROM replacement 
WHERE idx = num_params; 
+0

ありがとうございます!私はこの仕事をすることができます、楽しい時間があります;) – newSqlz

+0

私は1つのことを理解していませんでした。 p.indexとはどういう意味ですか?多分p.rownum? – newSqlz

0

あなたがテキストに適用すると、この

function replace_params (p_string varchar2) return varchar2 is 
    l_newstr varchar2(32767) := p_string; 
begin 
    for r in (select name, value from params) loop 
    l_newstr := replace (l_newstr, '[[[' || r.name || ']]]', r.value); 
    end loop; 
    return l_newstr; 
end; 

のようにPL/SQLの関数を書くことができます:

select replace_params(text) from text; 
+0

nope、plsqlは拒否されました:(ハードコアのみ、ネイティブSQLのみ – newSqlz

-1

あなたが好きなものを使用することができます角括弧の数が必ずしも同じではないと仮定している。ここでは、機能の例です:あなたはこれで役立つ場合MT0 @

create table #Text 
(
    _id int, 
    _text nvarchar(500) 
) 

Insert Into #Text SELECT 1, 'sample text [[[aaa]]], random text [[[bb]]] ... [[zzz]]' 

create table #Params 
(
    _name nvarchar(50), 
    _value nvarchar(50) 
) 

Insert Into #Params SELECT 'aaa', '111' 
Insert Into #Params SELECT 'bb', '222' 
Insert Into #Params SELECT 'zzz', '999' 

Declare @_result nvarchar(500); 

Set @_result = (Select _text from #Text WITH (NOLOCK) 
Where _id = 1) 

SELECT @_result; 

declare c cursor local for 
Select _name,_value from #Params WITH (NOLOCK) 

declare @_name nvarchar(50), @_value nvarchar(50) 
open c 
FETCH NEXT FROM c INTO @_name, @_value 
WHILE @@fetch_status = 0 
    BEGIN 
    SET @_result = REPLACE(@_result,'['[email protected]_name+']',@_value); 
    FETCH NEXT FROM c INTO @_name, @_value 
    END 
CLOSE c 
DEALLOCATE c 

SET @_result = REPLACE(REPLACE(@_result,'[',''),']',''); 

SELECT @_result; 

DROP TABLE #Text 
DROP TABLE #Params 
+0

これはSQL Serverの回答と思われます。残念ながら、質問にはOracleのタグが付いていますが、これは質問に答えません。 – MT0

関連する問題