使sql where语句对字符串中的每个值都是动态的
我目前正在搜索一个具有相对静态查询的表。 这不是一个完美的查询,因为本例中的原始搜索输入是使sql where语句对字符串中的每个值都是动态的,sql,sql-server,split,where-in,Sql,Sql Server,Split,Where In,我目前正在搜索一个具有相对静态查询的表。 这不是一个完美的查询,因为本例中的原始搜索输入是Denny drive。搜索输入应按空格分隔(可能使用string\u split)。因此,我只想要行,其中denny和drive位于givenname,surename或streetaddress 这是zwei therms的当前查询: DECLARE@query1 NVARCHAR(最大值) 声明@query2 NVARCHAR(最大值) 设置@query1='Denny' 设置@query2='dri
Denny drive
。搜索输入应按空格分隔(可能使用string\u split
)。因此,我只想要行,其中denny
和drive
位于givenname
,surename
或streetaddress
这是zwei therms的当前查询:
DECLARE@query1 NVARCHAR(最大值)
声明@query2 NVARCHAR(最大值)
设置@query1='Denny'
设置@query2='drive'
挑选
*
从…起
法克纳姆斯f
哪里
(给定名称如“%”++@query1++“%”或姓氏如“%”++@query1++“%”或街道地址如“%”++@query1++“%”),以及
(给定名称如“%”++@query2++“%”或姓氏如“%”++@query2++“%”或街道地址如“%”++@query2++“%”)
有可能使where语句更灵活吗?因此,我只能有一个带有SET@query='Denny drive vegas'
的变量,并且对于每个拆分的元素,where语句与另一个组合(给定名称,如“%”++@queryY++“%”,或姓氏,如“%”++@queryY++“%”,或街道地址,如“%”++@queryY++“%”)
样本数据:
| givenname | surname | streetaddress |
|:----------|---------:|:--------------------:|
| Irene | Williams | 2835 Crestview Manor |
| Denny | Wade | 885 Baker drive |
| Denny | Reese | 129 Owagner Lane |
预期结果:
| givenname | surname | streetaddress |
|:----------|---------:|:--------------------:|
| Denny | Wade | 885 Baker drive |
这是灵活的:
Table
Create Table fakenames
(
givenname nVarChar(25),
surname nVarChar(25),
streetaddress nVarChar(50)
)
Insert Into fakenames Values
('Denny','Smith','Main St'),
('Billy','vegas','Main St'),
('John','Travolta','Main St'),
('Mick','Jagger','Willow Ave'),
('Mary','Jane','Oak drive')
质疑
结果
givenname surname streetaddress val1 val2 val3
--------- ------- ------------- --- --- ---
Denny Smith Main St Denny NULL NULL
Billy vegas Main St NULL vegas NULL
Mary Jane Oak drive NULL NULL drive
如果我正确理解你的问题,你可以尝试下一种方法。您需要使用
STRING\u split()
(或其他函数,如果您不使用SQL Server 2016+),拆分搜索文本,并计算拆分文本每个部分的匹配项
输入:
CREATE TABLE #fakenames (
givenname varchar(100),
surname varchar(100),
streetaddress varchar(100)
)
INSERT INTO #fakenames
(givenname, surname, streetaddress)
VALUES
('Irene', 'Williams', '2835 Crestview Manor'),
('Denny', 'Wade', '885 Baker drive'),
('Denny', 'Reese', '129 Owagner Lane')
声明:
DECLARE @query varchar(max)
SET @query = 'Denny drive'
SELECT f.*
FROM #fakenames f
CROSS APPLY STRING_SPLIT(@query, ' ') s
GROUP BY f.givenname, f.surname, f.streetaddress
HAVING
SUM(CASE
WHEN (givenname LIKE '%' + s.[value] + '%') OR
(surname LIKE '%' + s.[value] + '%') OR
(streetaddress LIKE '%' + s.[value] + '%') THEN 1 ELSE 0 END
) = (SELECT COUNT(*) FROM STRING_SPLIT(@query, ' '))
输出:
---------------------------------
givenname surname streetaddress
---------------------------------
Denny Wade 885 Baker drive
这两个元素必须至少存在于一列中?是@SalmanA,查询中的每个元素必须至少存在于一列中。@David。样本数据和期望的结果确实会有帮助。一个黑客可能会对所有内容进行解析,并使用contains:-)@GordonLinoff我已经在问题中添加了样本数据和期望的结果。
---------------------------------
givenname surname streetaddress
---------------------------------
Denny Wade 885 Baker drive