2

ターゲット区切り文字列のキーとして機能する区切り文字列があります。2 つの値がキー シーケンスのどこにあるかを知り、ターゲット文字列からそれらの位置のみを取得する必要があります。

例 1
キー : ,15,90,104,73,95,13,​​14、
ターゲット : ミディアム~男性~28~緑~右~いいえ~2013/10/04

例 2
キー: ,14,73,104,95,15,13,​​90,
ターゲット: 2013/12/03~緑~28~右~中~いいえ~男性~

ターゲットの性別と日付の値のみを気にし、キーの対応するエントリは常に 14 と 90 になります

これらの値が順番にどこにあるかがわかったら (例 1 の位置 2 と 7)、ターゲット文字列の同じセクションを引き出す必要があるため、最終的には性別と日付の値がそれぞれの変数に含まれます。

質問を理解しやすくするために、探しているデータの種類を変更しました

それが理にかなっていることを願っています

ありがとう

マット

4

3 に答える 3

0

2 つの文字列を分割できます (こちらを参照してください: T-SQL で同等の関数を分割しますか? )。

次に、文字列を 2 つのテーブル オブジェクトに分割したら、両方の N 番目のレコードに (たとえば TOP キーワードを使用して) アクセスすると、結果を取得できます。

2 つの文字列と int を指定すると、結合された 2 つの値を取得する関数を記述できます。

于 2013-04-10T09:35:41.983 に答える
0

簡単なフォローアップとして、上記の解決策を適用するのに問題があったため(おそらく私の側の知識不足が原因です)、次の関数を作成し、それらが仕事をします

順次値を取得 ----------------------------------------------- -----------------------

DECLARE @Attributemask varchar(max) = '[PASS IN KEY STRING]' 
DECLARE @Required varchar(10) = '[PASS IN VALUE TO LOOK FOR FOLLOWED BY A COMMA]'
DECLARE @AttPosition int
DECLARE @TempString varchar(max)
DECLARE @Result as int

SET @AttPosition = CHARINDEX(@Required, @Attributemask)
SET @TempString = LEFT(@Attributemask, @AttPosition)
SET @Result = len(@TempString)-len(replace(@TempString,',',''))
SELECT @Result

データを取得する------------------------------------------------ ----------------------------------

DECLARE @ChangeData varchar(max) = '[PASS IN TARGET STRING]'
DECLARE @AttPos int = [PASS IN RESULT FROM PREVIOUS FUNCTION] 
DECLARE @Count int = 1
DECLARE @NotNeeded varchar(100)
Declare @Result varchar(max)

SET @ChangeData = '~'+@ChangeData

WHILE @Count < (@AttPos +1)
BEGIN
    SET @NotNeeded = CHARINDEX('~', @ChangeData)
    SET @ChangeData = right(@ChangeData,len(@ChangeData) - @NotNeeded)
    IF len(@ChangeData) = 0 BREAK
    SET @Count = @Count +1
END

SET @Result = LEFT(@ChangeData, (CHARINDEX('~', @ChangeData)))
SET @Result = LEFT(@Result, (LEN(@Result)-1))
Select @Result
于 2013-04-11T07:54:47.837 に答える
0

この解決策を試してください -

DECLARE @temp TABLE
(
      id INT IDENTITY(1,1)
    , k NVARCHAR(100)
    , t NVARCHAR(500)
)

INSERT INTO @temp (k, t)
VALUES 
    (',15,90,104,73,95,13,14,', 'Medium~Male~28~Green~Right~No~10/04/2013'),
    (',14,73,104,95,15,13,90,', '12/03/2013~Green~28~Right~Medium~No~Male~')

SELECT 
      data.id
    , data.p
    , data.r 
FROM (
    SELECT 
          p = p.value('(.)[1]', 'NVARCHAR(50)')
        , po = p.value('for $i in . return count(../*[. << $i])', 'int')
        , r = r.value('(.)[1]', 'NVARCHAR(50)')
        , ro = r.value('for $i in . return count(../*[. << $i])', 'int')
        , d.id
    FROM (
        SELECT 
              t.id
            , txml = CAST('<r><s>' + REPLACE(t.k + ',', ',', '</s>' + '<s>') + '</s></r>' AS XML)
            , kxml = CAST('<r><s>' + REPLACE(t.t + '~', '~', '</s>' + '<s>') + '</s></r>' AS XML)  
        FROM @temp t
    ) d
    CROSS APPLY kxml.nodes('/r/s') t(p)
    CROSS APPLY txml.nodes('/r/s') k(r)
) data
WHERE data.po = data.ro - 1
    AND data.r IN ('14', '90')
    --AND r + data.p != ''
ORDER BY data.id
于 2013-04-10T10:24:59.253 に答える