0

次の形式の文字列があります。特定の文字を削除するためにSQLで1回限りの関数を作成しようとしています。

サンプル文字列:

Var s = '18160 ~ SCC-Hard Drive ~ 4 ~ d | 18170 ~ SCC-SSD ~ 4 ~ de | 18180 ~ SCC-Monitor ~ 5 ~ | 18190 ~ SCC-Keyboard ~ null ~'

望ましい結果:

s = 'SCC-Hard Drive ~ 4 ~ d | SCC-SSD ~ 4 ~ de | SCC-Monitor ~ 5 ~
   |SCC-Keyboard ~ null ~'

上記のIDに気付いた場合、たとえば18160、18170、18180、および18190が削除されました。これは単なる例です。構造は次のとおりです。

id: 18160
description : SCC-Hard Drive
Type: 4
comment: d

したがって、複数のアイテムがある場合は、Pikeデリメータを使用して連結されます。したがって、私の要件は、上記の構造の特定の文字列からIDを削除することです。

Javascriptでは、正規表現を使用して次のことを実行できることを知っています。これは機能します。SQL08で実行する必要があります。

s.replace(/\d{5}\s~\s/g, "")
4

2 に答える 2

1

CHARINDEXSQLで実行する必要がある場合は、これを使用するのが好きです。ただし、この種の文字列操作にSQLを使用することは、できる限り避けようとしています。

このようなものが機能するはずです:

DECLARE @s VARCHAR(2500), @result VARCHAR(2500), @tilde INT, @pipe INT, @length INT, @calc INT
SELECT @s = '18160 ~ SCC-Hard Drive ~ 4 ~ d | 18170 ~ SCC-SSD ~ 4 ~ de | 18180 ~ SCC-Monitor ~ 5 ~ | 18190 ~ SCC-Keyboard ~ null ~'
SELECT @length = LEN(@s)
SELECT @tilde = PATINDEX('% ~%', @s);
SELECT @pipe =  PATINDEX('% | %', @s);

--If there's no tilde, then there's only one element
IF (@tilde = 0 OR @length = 0)
BEGIN
    SELECT @s; 
    RETURN;
END 
--If no pipe, there's only one set
ELSE IF @pipe = 0
BEGIN
    SELECT REPLACE(@s, SUBSTRING(@s, 0, @tilde +3), '')
    RETURN;
END
ELSE
BEGIN
    --clear first id
    SELECT @s = REPLACE(@s, SUBSTRING(@s, 0, @tilde +3), '')
    SELECT @pipe = CHARINDEX('|', @s)
    SELECT @tilde = CHARINDEX('~', @s, @pipe +1);
    WHILE @pipe > 0
    BEGIN
        SELECT @calc = (@tilde - @pipe)     
        SELECT @s = REPLACE(@s, SUBSTRING(@s, @pipe + 1, @calc), '')
        SELECT @pipe = CHARINDEX('|', @s, @pipe +1)
        SELECT @tilde = CHARINDEX('~', @s, @pipe +1);
    END
    SELECT @s
END
于 2013-03-25T18:38:24.030 に答える
0

単一の式でそれを行うことはできないと思いますが、レコード区切り文字|が使い果たされるまでループする関数を作成するのは非常に簡単なはずです。一致するたびに、最初の〜を見つけます。ループに沿って文字列の一部を連結します。DBMSで一般的な関数locate、substring、およびconcatを使用する必要があります。正確に何が問題なのかはわかりませんが、正規表現は標準ではなく、少なくともmySQLではそれらを置換に使用することはできません。

于 2013-03-25T18:44:53.950 に答える