-1

データを 1 つの列から複数の列に分離するためのクエリの記述に問題があります。

例:

Col1
---------------------------
bank.wrong.transaction
bank.wrong.transaction.captured
business.unit.explored.wrong.way
application.failed

次のような列にデータを配置する必要があります。

col1      col2           col3
-------------------------------------------------    
wrong     transaction    null
wrong     transaction    captured
unit      explored       wrong
failed    null           null

文字列の長さはまったくわかりません。

これで私を助けてください。

ありがとうサハ..

4

2 に答える 2

1

次のようなものを使用して、要求された出力を取得できます(ParseString関数を奪った場所を思い出せませんが、常に使用していますが、うまく機能します)

CREATE FUNCTION dbo.fnParseString
    (
      @Section SMALLINT ,
      @Delimiter CHAR ,
      @Text VARCHAR(MAX)
    )
RETURNS VARCHAR(8000)
AS 
    BEGIN
        DECLARE @NextPos SMALLINT ,
            @LastPos SMALLINT ,
            @Found SMALLINT

        --#### Uncomment the following 2 lines to emulate PARSENAME functionality
        --IF @Section > 0 
        --    SELECT  @Text = REVERSE(@Text)

        SELECT  @NextPos = CHARINDEX(@Delimiter, @Text, 1) ,
                @LastPos = 0 ,
                @Found = 1

        WHILE @NextPos > 0
            AND ABS(@Section) <> @Found 
            SELECT  @LastPos = @NextPos ,
                    @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1) ,
                    @Found = @Found + 1

        RETURN  CASE
            WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
            --#### Uncomment the following lines to emulate PARSENAME functionality
            --WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
            WHEN @Section > 0 THEN SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)

            ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
        END
    END



DECLARE @TestData VARCHAR(255)
SET @TestData = 'business.unit.explored.wrong.way'

SELECT  dbo.fnParseString(2, '.', @TestData) ,
        dbo.fnParseString(3, '.', @TestData) ,
        dbo.fnParseString(4, '.', @TestData) ,
        dbo.fnParseString(5, '.', @TestData) ,
        dbo.fnParseString(6, '.', @TestData)
于 2012-05-15T20:40:36.313 に答える
0

質問には何も答えていませんが、私の仮定のいくつかが正しい場合 (たとえば、中間の 3 つの値のみを気にする場合)、冗長関数のオーバーヘッドなしでこの方法でデータを取得する方法を示します。

DECLARE @x TABLE(col1 VARCHAR(255));

INSERT @x 
SELECT 'bank.wrong.transaction'
UNION ALL SELECT 'bank.wrong.transaction.captured'
UNION ALL SELECT 'business.unit.explored.wrong.way'
UNION ALL SELECT 'application.failed';

WITH x(col1, d) AS
( 
  SELECT col1, SUBSTRING(col1, CHARINDEX('.', col1) + 1, 255) + 
    CASE WHEN LEN(col1) - LEN(REPLACE(col1, '.', '')) BETWEEN 1 AND 3 THEN
     REPLICATE('./', 4-(LEN(col1)-LEN(REPLACE(col1, '.', '')))) ELSE '' END
    FROM @x
)
SELECT orig = col1, 
    col1 = NULLIF(PARSENAME(d, 4), '/'), 
    col2 = NULLIF(PARSENAME(d, 3), '/'),
    col3 = NULLIF(PARSENAME(d, 2), '/')
FROM x;

結果:

orig                              col1        col2         col3
--------------------------------  ----------  -----------  --------
bank.wrong.transaction            wrong       transaction  NULL
bank.wrong.transaction.captured   wrong       transaction  captured
business.unit.explored.wrong.way  unit        explored     wrong
application.failed                failed      NULL         NULL
于 2012-05-15T21:05:30.693 に答える