簡體   English   中英

如何搜索列表是否包含另一個列表中的值

[英]How to search if a list contains values from another list TSQL

好吧,我對此進行了廣泛的研究,並嘗試了許多技術,但沒有成功。

我有一個名稱列表,我有一個位置列表。 某些位置中包含完整的名稱字符串。

我只想將其中包含名稱的位置拉出,並且我不想從%names%的硬編碼列表中進行檢查,因此需要可伸縮。 下面是我正在使用的工具(我不會每次都檢查現有的臨時表,真的不是很需要)

除所有最后查詢外,我最后都嘗試合並所有查詢

IF OBJECT_ID('tempdb..#ProviderList') IS NOT NULL
DROP TABLE #ProviderList

SELECT distinct
Station
,StaffName --first and last concatenated
,lastName
,ProviderID
--,[ProviderRole]
INTO #ProviderList
FROM --Omited--
Where PrimaryProviderSID in (Select distinct
                            PrimaryProviderSID
                        ----
                        Where PrimaryPosition not like '%zz%'
                            AND PrimaryProviderID > 0)
    AND [TerminationDate] is null
AND (InactivationDate is null)




Select LastName 
INTO #LastName
from #ProviderList


/* Failed experiment
Declare @Names as Table(Name varchar(max))
Insert Into @Names Select LastName 
from #ProviderList

--Select* From @Names

Failed experiment
*/






SELECT distinct [Many fields...],
  LocationName
Into #LocationName
  FROM ------
Where LocationName not like '%z%'
    AND ---filtering criteria to make my list

---------------組合在一起的部分

我想從#LocationName中選擇Everyting,但僅從Names列表中包含ANY記錄的記錄,它們將只包含一個或不包含任何記錄

Select *
From #LocationName  
Where #LastName in (LocationName)?
Where '%' + LastName + '%'  ? --tried concatenation, i want a fuzzy search
Where #LocationName contains(LocationName, #LastName)? ---i know syntax is wrong but this has not proven to be the correct technique anyway
Where Exists(Select LastName from #LastName) --made no change but Not Exists returned nothing...

----------同事給我帶來了這個:

 select lastname
 from #LastName
 Where charindex(LastName,
 (SELECT STUFF((SELECT ',' + LocationName
  FROM #LocationName
  FOR XML PATH('')) ,1,1,'') AS Txt )

  )>1

------但這僅是要給我們列出LocationName字段中包含的名稱的列表,我們也想提取Location Name

我知道這是一個漫長的過程,但我希望我相對清楚,至少在不需要做什么的情況下需要做什么。

我覺得我想創建一個數組,並分別比較每個Name值以查看它是否包含在LocationName中,然后如果是,則將其添加到新列表中。 那將是理想的

試試這個...

CREATE TABLE #NAMES (NAME VARCHAR(100))
CREATE TABLE #LOCATIONS (LOCATIONNAME VARCHAR(100))

INSERT INTO #NAMES 
SELECT 'DAVE' UNION
SELECT 'BOB' UNION 
SELECT 'JIMMY'

INSERT INTO #LOCATIONS 
SELECT 'TODDS BOAT' UNION
SELECT 'MARYS HOUSE' UNION
SELECT 'DAVES HOTTUB' UNION
SELECT 'JIMMYS CRICKEY CLUB'

SELECT L.*
FROM #LOCATIONS L
CROSS APPLY #NAMES N
WHERE CHARINDEX(N.NAME, L.LOCATIONNAME)>0

也許這確實值得一個單獨的答案,而不僅僅是對JiggsJedi的評論。

也可以使用相關子查詢來完成。 兩種示例數據上的執行計划都是相同的。

使用來自JiggsJedi的樣本數據。

SELECT L.* 
  FROM #LOCATIONS L 
 WHERE EXISTS (SELECT 1 
                 FROM #NAMES N 
                WHERE CHARINDEX(N.NAME, L.LOCATIONNAME) > 0)

暫無
暫無

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

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