![](/img/trans.png)
[英]How can I compare two name strings that are formatted differently in 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.