1

私はそのようにパイプで区切られた数字を含む文字列を持っています23|12|12|32|43

SQLを使用して、各数値を抽出し、10を加算してから合計して、合計を求めます。

4

3 に答える 3

3

別の方法は次のとおりです。

declare @str nvarchar(max) = '23|12|12|32|43';

set @str = 'select '+replace(@str, '|', '+');

exec(@str);
于 2013-03-27T10:56:18.793 に答える
2

再帰共通テーブル式を使用した答え:

WITH cte AS (
  SELECT
    '23|12|12|32|43' + '|' AS string
    ,0 AS total
  UNION ALL
  SELECT
    RIGHT(string, LEN(string) - PATINDEX('%|%', string))
    ,CAST(LEFT(string, PATINDEX('%|%', string) - 1) AS INT) + 10
  FROM cte
  WHERE PATINDEX('%|%', string) > 0

)
SELECT SUM(total) AS total FROM cte

再帰ターミネーターとして、ストリング内にパイプが他に存在するかどうかを確認しましたが、元のストリングの最後に余分なパイプを連結することで、最後の要素を見逃してしまいました。 WHERE句を表現するためのより良い方法です。

于 2013-03-27T10:03:25.710 に答える
2

これを行う別の方法は次のとおりです。

DECLARE @s VARCHAR(1000) = '23|12|12|32|43'

SELECT CAST('<root><e>' + REPLACE(@s, '|', '</e><e>') + '</e></root>' AS XML)
        .value('sum(/root/e) + count(/root/e) * 10', 'INT')

XMLこれは、データ型とそれによって提供される関数へのキャストを使用します。

例としてこれを投稿しましたが、あなたのアプローチの方がはるかに優れたパフォーマンスを発揮します。

于 2013-03-27T10:47:57.347 に答える