在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中。。。