使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