0

私は次のような文字列を持っています

オープンシステムサブGR(GM / BTIB(1111)/ BTITDBL(2222)/ BTVY(4444)/ ACSVTYSAG)

データベースのGROUPS列の下にあります。

私がやりたいのは、その文字列から2222を抽出することです。私が使っているコードはそのようなものです。

    SELECT 
        SUBSTRING(GROUPS, CHARINDEX('(',GROUPS, CHARINDEX('(',GROUPS, CHARINDEX('(',GROUPS,0)+1)+1)+1, 4 ) AS GroupNo

    FROM MY_TABLE

    WHERE

    ISNUMERIC(SUBSTRING(GROUPS, CHARINDEX('(',GROUPS, CHARINDEX('(',GROUPS, CHARINDEX('(',GROUPS,0)+1)+1)+1, 4 )) = 1

使用している部分文字列の方法を変更するか、ロジックを変更して、上記のコードを修正する必要があります。私のコードで何を改善できるか教えていただけますか?

4

3 に答える 3

1

それを頻繁に行っている場合は、トリガーを介して挿入/更新/削除時にデータを解析して別のテーブル (たとえばMY_TABLE_ELEMENTS) を作成し、次に SELECT をMY_TABLE結合してMY_TABLE_ELEMENTS.

たとえば、分割関数 (コードを正しく理解していれば "(" で分割) を使用して、各分割要素全体を MY_TABLE_ELEMENTS に格納するか、数値部分だけを解析することができます。

于 2010-01-15T08:29:06.267 に答える
1

セットベースの実装。

これは、単一行のコードよりもパフォーマンスが低くなりますが、特に動的数値テーブルを生成する CTE を静的数値テーブルに置き換える場合は、より大きな結果セットに対してより適切にスケーリングされるはずです。

DECLARE @t TABLE
(groups VARCHAR(250))

INSERT @t
VALUES ('OPEN SYSTEMS SUB GR (GM/BTIB(1111)/BTITDBL(2222)/BTVY(4444)/ACSVTYSAG)')

INSERT @t
VALUES ('OPEN SYSTEMS SUB GR (GM/BTIB(1111)/BTITDBL(3333)/BTVY(4444)/ACSVTYSAG)')

DECLARE @chr_delim CHAR(1)
SET @chr_delim = '('

-- nums_cte generates a dynamic numbers table
-- replace this with your own numbers table if you have one
;WITH nums_cte 
AS 
( 
        SELECT 1 AS n 
        UNION ALL 
        SELECT n+1 FROM nums_cte 
        WHERE n < 250
) 
,splitCTE    
AS
(
        SELECT  SUBSTRING(s,n,CHARINDEX(@chr_delim, s + @chr_delim,n) -n) AS ELEMENT
                ,s
                ,ROW_NUMBER() OVER (PARTITION BY s
                                    ORDER BY n
                                   ) AS rn
        FROM (SELECT groups AS s FROM @t) AS D
        JOIN nums_cte
        ON n <= LEN(s)
        AND SUBSTRING(@chr_delim + s,n,1) = @chr_delim 
)
SELECT LEFT(ELEMENT,4) AS GroupNo
       ,s AS originalString
FROM splitCTE
WHERE rn = 4
AND   ISNUMERIC(LEFT(ELEMENT,4)) = 1
OPTION (MAXRECURSION 0)
于 2010-01-15T09:41:38.617 に答える
1

regexを実装する CLR UDF を実装できます。

于 2010-01-15T08:31:27.417 に答える