簡體   English   中英

如何在SQL Server中比較這兩個字符串?

[英]How can I compare these two strings in SQL Server?

因此,我需要將一個字符串與另一個字符串進行比較,以查看該字符串的任何部分是否匹配。 這對於檢查銷售人員ID列表是否與特定GM列出的ID列表是否匹配,或者是否屬於該GM的ID列表范圍之外,將非常有用:

  ID_SP         ID_GM         NEEDED FIELD (overlap)
  136,338,342   512,338,112         338
  512,112,208   512,338,112         512,112
  587,641,211   512,338,112         null

我正在努力實現這一目標。 我正在猜測某種UDF?

我意識到在使用for XML path('')之前這樣做會容易得多,但是我希望找到一種不需要拆散數據的解決方案,因為這樣會破壞數據的整體大小。數據集。

不,那不是你的方式。 您將返回原始數據。 要獲得共同的ID:

select tbob.id
from t tbob join
     t tmary
     on tbob.id = tmary.id and tbob.manager = 'Bob' and tmary.manager = 'Mary';

由於數據集不是兩個原始數據,而是一個“連接字段”和一個硬編碼字符串字段,該字段是GMID列表(每行的值相同),因此正確答案(從問題的起點)是使用諸如node('/ M')之類的東西作為Split(a)。

然后,您將得到如下內容:

  ID_SP      ID_GM
  136        512,338,112
  338        512,338,112
  342        512,338,112

並可以執行以下操作:

  case when  ID_GM not like '%'+ID_SP+'%'then 1 else 0 end as 'indicator'

您可以從此處匯總並匯總指標字段,並說如果> 0,則ID_SP存在於ID_GM列表中

希望這對其他人有幫助。

- 嘗試這個

Declare @String1 as varchar(100)='512,112,208';

Declare @String2 as varchar(100)='512,338,112';

WITH FirstStringSplit(S1) AS
(
    SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML)
)
,SecondStringSplit(S2) AS
(
    SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML)
)

SELECT STUFF(
(
    SELECT ',' + part1.value('.','nvarchar(max)')
    FROM FirstStringSplit
    CROSS APPLY S1.nodes('/x') AS A(part1)
    WHERE part1.value('.','nvarchar(max)') IN(SELECT B.part2.value('.','nvarchar(max)')
                                                  FROM SecondStringSplit 
                                                  CROSS APPLY S2.nodes('/x') AS B(part2)
                                                  ) 
    FOR XML PATH('')

),1,1,'')

戈登是正確的,您不應這樣做。 這應該使用原始數據完成。 以下代碼將“返回原始數據”,並通過簡單的INNER JOIN解決。

CTE將創建派生表(所有要避免的所有行)並檢查它們是否相等(不使用索引!提前這樣做的另一個原因):

DECLARE @tbl TABLE(ID INT IDENTITY,ID_SP VARCHAR(100),ID_GM VARCHAR(100));
INSERT INTO @tbl VALUES
 ('136,338,342','512,338,112')
,('512,112,208','512,338,112')
,('587,641,211','512,338,112');

WITH Splitted AS
(
    SELECT t.*
          ,CAST('<x>' + REPLACE(t.ID_SP,',','</x><x>') + '</x>' AS xml) AS PartedSP
          ,CAST('<x>' + REPLACE(t.ID_GM,',','</x><x>') + '</x>' AS xml) AS PartedGM
    FROM @tbl AS t
)
,SetSP AS
(
    SELECT Splitted.ID
          ,Splitted.ID_SP
          ,x.value('text()[1]','int') AS SP_ID 
    FROM Splitted
    CROSS APPLY PartedSP.nodes('/x') AS A(x)
)
,SetGM AS
(
    SELECT Splitted.ID
          ,Splitted.ID_GM
          ,x.value('text()[1]','int') AS GM_ID 
    FROM Splitted
    CROSS APPLY PartedGM.nodes('/x') AS A(x)
)
,BackToYourRawData AS --Here is the point you should do this in advance!
(
SELECT SetSP.ID
      ,SetSP.SP_ID 
      ,SetGM.GM_ID
FROM SetSP
INNER JOIN SetGM ON SetSP.ID=SetGM.ID 
                 AND SetSP.SP_ID=SetGM.GM_ID
)
SELECT ID
      ,STUFF((
        SELECT ',' + CAST(rd2.SP_ID AS VARCHAR(10))
        FROM BackToYourRawData AS rd2
        WHERE rd.ID=rd2.ID
        ORDER BY rd2.SP_ID
        FOR XML PATH('')),1,1,'') AS CommonID
FROM BackToYourRawData AS rd
GROUP BY ID;

結果

ID  CommonID
1   338
2   112,512

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM