在SQL查询的WHERE子句中使用表的值

在SQL查询的WHERE子句中使用表的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张表格,上面有很多公司的描述 TABLE dbo.[TblCompanies] ( [CompanyID] [int] IDENTITY(1,1) NOT NULL, [CompanyProfile] [nvarchar](max) NOT NULL ) 描述是这样的 “安捷伦科技有限公司为客户提供以应用程序为中心的解决方案 ..” 我还有另一张有一些字符串的桌子 TABLE dbo.[TblFilter] ( [Pattern] [nvarcha

我有一张表格,上面有很多公司的描述

TABLE dbo.[TblCompanies]
(
    [CompanyID] [int] IDENTITY(1,1) NOT NULL,
    [CompanyProfile] [nvarchar](max) NOT NULL
)
描述是这样的

“安捷伦科技有限公司为客户提供以应用程序为中心的解决方案 ..”

我还有另一张有一些字符串的桌子

TABLE dbo.[TblFilter]
    (
        [Pattern] [nvarchar](100) NOT NULL
    )
比如说

技术

应用程序

如何获取所有公司的
companyID
,这些公司在其
CompanyProfile
中具有
TblFilter
中的值?
CompanyProfile
中筛选器字符串的出现顺序不重要。重要的是所有这些字符串都将位于
公司文件中

最好是没有游标的解决方案

谢谢。

像这样试试

我希望我最终能做到这一点:

任何匹配项都将计为
1
。这些值的总和必须等于表
模式中的计数

DECLARE @companies TABLE(ID INT IDENTITY, YourText VARCHAR(100));
INSERT INTO @companies VALUES
 ('This contains abc and xyz')
,('This contains mno')
,('This contains abc and xyz and mno')
,('This contains nothing')
,('This contains abc');

DECLARE @pattern TABLE(ID INT IDENTITY,YourPattern VARCHAR(100));
INSERT INTO @pattern VALUES
 ('abc')
--,('def')
,('xyz');

SELECT c.ID,c.YourText
FROM @companies AS c
CROSS JOIN @pattern AS p
GROUP BY c.ID,c.YourText
HAVING SUM(CASE WHEN c.YourText LIKE '%' + p.YourPattern + '%' THEN 1 ELSE 0 END)=(SELECT COUNT(*) FROM @pattern)

您可以筛选出任何模式都不匹配的行:

select  *
from    TblCompanies c
where   not exists
        (
        select  *
        from    TblFilter f
        where   c. CompanyProfile not like '%' + f.Pattern + '%'
        )

您应该考虑创建
全文索引
,如下所述: 在这里:

简言之:

CREATE FULLTEXT CATALOG FTCat;  
GO

-- There has to be a unique key for the Full Text Search to identify the row
CREATE UNIQUE INDEX ui_CompanyID ON dbo.TblCompanies(CompanyID);  
GO

CREATE FULLTEXT INDEX ON dbo.TblCompanies  
(  
    CompanyProfile                --Full-text index column name  
    Language 2057                 --2057 is the LCID for British English  
)  
KEY INDEX ui_CompanyID ON FTCat      --Unique index  
WITH CHANGE_TRACKING AUTO            --Population type;  
GO
然后,您可以使用
自由文本
包含
进行查询:

SELECT CompanyID
      ,CompanyProfile
FROM dbo.TblCompanies 
WHERE CONTAINS(CompanyProfile, 'technology AND applications')
我们可以这样做:

select * from @companies c where exists (select 1 from @pattern p where c.YourText like concat('%',p.YourPattern,'%'))

技术
应用程序
你说得对,但目前我需要精确匹配。将
插入到@pattern VALUES('abc'),('xyz'),('yz')中不起作用@AlexK,可能我遗漏了什么,但这应该有用。
交叉联接
返回所有组合,计数应正确。但无论如何,公认的答案要好得多:-)问题不在交叉连接中,而在LIKE中“xyz”包含“yz”,这会导致错误的条件。@AlexK,嗯,不。。。这取决于。。。我们不知道OP是否想以不同的方式处理重叠模式。。。OP just statet:所有这些字符串都将在CompanyProfile中。。。