Arrays 如何搜索一个列表是否包含来自另一个列表TSQL的值

Arrays 如何搜索一个列表是否包含来自另一个列表TSQL的值,arrays,tsql,compare,contains,exists,Arrays,Tsql,Compare,Contains,Exists,好的,我对此做了广泛的研究,尝试了很多技术,但都没有效果 我有一张名单,我有一张地点名单。某些位置包含全名字符串 我只想提取其中某处包含名称的位置,我不想从硬编码的%Names%列表中进行检查,需要可扩展。 我的工作是在下面,我不会每次都检查现有的临时表,sry不是真的需要 此外,除了最后一个我最终尝试合并的查询之外,所有查询都是单独工作的 IF OBJECT_ID('tempdb..#ProviderList') IS NOT NULL DROP TABLE #ProviderList SE

好的,我对此做了广泛的研究,尝试了很多技术,但都没有效果

我有一张名单,我有一张地点名单。某些位置包含全名字符串

我只想提取其中某处包含名称的位置,我不想从硬编码的%Names%列表中进行检查,需要可扩展。 我的工作是在下面,我不会每次都检查现有的临时表,sry不是真的需要

此外,除了最后一个我最终尝试合并的查询之外,所有查询都是单独工作的

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,但只选择包含名称列表中任何记录的记录,它们将只包含一个或不包含任何记录

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字段中的名称列表,我们还想提取位置名称

我知道这是一个漫长的过程,但我希望我相对清楚地知道需要做什么,至少如果不是如何做的话

我觉得我想创建一个数组,分别比较每个名称值,看看它是否包含在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的评论

SELECT L.* 
  FROM #LOCATIONS L 
 WHERE EXISTS (SELECT 1 
                 FROM #NAMES N 
                WHERE CHARINDEX(N.NAME, L.LOCATIONNAME) > 0)
它也可以通过相关子查询完成。此示例数据的执行计划在两种方式中都是相同的

使用JiggsJedi的样本数据

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

一组样本数据可能会澄清您的问题。我想你说你的表名name的值类似于'bob'和'jim',表位置locationName,等等locationName的值类似于'house of bob','jims office','joes crab shack'。您希望选择包含“bob之家”或“jims office”的行,因为这些行的值包含其中一个名称。^这完全正确,这确实回答了我认为gruff的问题。它也可以通过相关子查询完成。此示例数据的执行计划在两种方式中都是相同的。从存在的位置L中选择L.*从名称N中选择1,其中CHARINDEXN.NAME,L.LOCATIONNAME>0