Arrays 如何搜索一个列表是否包含来自另一个列表TSQL的值
好的,我对此做了广泛的研究,尝试了很多技术,但都没有效果 我有一张名单,我有一张地点名单。某些位置包含全名字符串 我只想提取其中某处包含名称的位置,我不想从硬编码的%Names%列表中进行检查,需要可扩展。 我的工作是在下面,我不会每次都检查现有的临时表,sry不是真的需要 此外,除了最后一个我最终尝试合并的查询之外,所有查询都是单独工作的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
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