【问题标题】:How to search if a list contains values from another list TSQL如何搜索列表是否包含来自另一个列表 SQL 的值
【发布时间】:2014-03-09 20:49:28
【问题描述】:

好的,我对此进行了广泛的研究,并尝试了许多技术均无济于事。

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

我只想提取其中包含名称的位置,并且我不想从 %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,但只选择包含 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 字段中的名称列表,我们还想提取位置名称

我知道这是一篇很长的文章,但我希望我相对清楚地知道至少需要做什么,如果不是我该怎么做的话。

我觉得我想创建一个数组并单独比较每个 Name 值以查看它是否包含在 LocationName 中,如果是,则将其添加到新列表中。这将是理想的

【问题讨论】:

  • 一组数据样本可能会阐明您的要求。我认为您的说法是,表名称(名称)的值类似于“鲍勃”和“吉姆”,表位置(位置名称等)的位置名称值类似于“鲍勃之家”、“吉姆斯办公室”、“乔斯蟹棚” '。并且您想选择包含“house of bob”或“jims office”的行,因为它们的值包含其中一个名称。
  • ^完全正确

标签: arrays tsql compare contains exists


【解决方案1】:

试试这个...

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

【讨论】:

  • 这确实回答了我认为粗鲁的问题。它也可以通过相关子查询来完成。此示例数据的执行计划是相同的。 SELECT L.* FROM #LOCATIONS L WHERE EXISTS (SELECT 1 FROM #NAMES N WHERE CHARINDEX(N.NAME, L.LOCATIONNAME)>0)
【解决方案2】:

也许这确实值得一个单独的答案,而不仅仅是对 JiggsJedi 的评论。

也可以通过相关子查询来完成。此示例数据的执行计划是相同的。

使用来自 JiggsJedi 的样本数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2020-08-13
    • 2022-11-21
    • 2022-08-10
    • 2016-10-29
    相关资源
    最近更新 更多