2

我有一个分隔字符串,它充当目标分隔字符串的键。我需要知道 2 个值在键序列中的位置,然后只从我的目标字符串中提取这些位置。

示例 1
键:,15,90,104,73,95,13,​​14,
目标:Medium~Male~28~Green~Right~No~10/04/2013

示例 2
Key : ,14,73,104,95,15,13,​​90,
Target : 12/03/2013~Green~28~Right~Medium~No~Male~

我只关心目标中的性别和日期值,键中的相应条目将始终为 14 和 90

一旦我知道这些值的顺序位置(示例 1 中的位置 2 和 7),我需要提取目标字符串的相同部分,以便最终在它们自己的变量中得到性别和日期值

我已更改要查找的数据类型,以使问题更易于理解

我希望这是有道理的

谢谢

马特

4

3 回答 3

0

您可以拆分这两个字符串(请参阅此处:Split function equivalent in T-SQL?)。

然后,当您在两个表对象中拆分字符串时,访问两者中的第 N 条记录(例如使用 TOP 关键字),您可以获得结果。

给定两个字符串和一个 int,您可以编写一个函数来获取两个耦合值。

于 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 回答