Sql server SQL-如何声明要在查询中使用的一组人名?
我将同时运行5个查询以返回5组不同的数据-它们的共同点是我的以下陈述:Sql server SQL-如何声明要在查询中使用的一组人名?,sql-server,tsql,where,having,declare,Sql Server,Tsql,Where,Having,Declare,我将同时运行5个查询以返回5组不同的数据-它们的共同点是我的以下陈述: HAVING ( LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%BRIAN%MILLER%') OR LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%LATEASHA%CALVERT
HAVING ( LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%BRIAN%MILLER%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%LATEASHA%CALVERT%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%CHERITA%MARTIN%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%CARMALITA%MCQUEEN%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%CRAIG%NADRATOWSKI%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%SCOTT%SMOLINSKI%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%ALISHA%WILLIAMS%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%SHANNON%MURPHY%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%MICHELLE%COLE%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%ROGER%KONKEL%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%DANIELLE%JONES%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%SABRINA%WARNER%') OR
LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-', comm.LONG_COMM_LINE_1) - 2) LIKE ('%CORINNE%DUBETZ%'))
我想在我的查询开始时定义这些人,以便稍后在having语句或where语句中使用,基本上是说
HAVING (left(comm.LONG_COMM_LINE_1, CHARINDEX('-',comm.LONG_COMM_LINE_1) - 2) LIKE [anyone that I've already defined above]
我不确定这是否可能,或者我会怎么做。任何帮助都将不胜感激 要展开Alex K的评论,可以从table变量开始:
DECLARE @People TABLE ([Name] VARCHAR(128));
INSERT @People VALUES ('%BRIAN%MILLER%'),('%LATEASHA%CALVERT%'),('%CHERITA%MARTIN%')
现在假设我有一个成员表,我需要根据您的条件查找该表中的成员,查询可能如下所示,我只是按名称分组以符合您的示例:
SELECT
M.[Name]
FROM
mem.Member M
GROUP BY
M.[Name]
HAVING
(EXISTS(SELECT 1 FROM @PEOPLE P WHERE M.Name LIKE P.Name))
SELECT
comm.[LONG_COMM_LINE_1]
FROM
comm
GROUP BY
comm.[LONG_COMM_LINE_1]
HAVING
(EXISTS(SELECT 1 FROM @PEOPLE P WHERE LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-',
comm.LONG_COMM_LINE_1) - 2) LIKE P.Name))
更具体地说,对于您的示例:
SELECT
M.[Name]
FROM
mem.Member M
GROUP BY
M.[Name]
HAVING
(EXISTS(SELECT 1 FROM @PEOPLE P WHERE M.Name LIKE P.Name))
SELECT
comm.[LONG_COMM_LINE_1]
FROM
comm
GROUP BY
comm.[LONG_COMM_LINE_1]
HAVING
(EXISTS(SELECT 1 FROM @PEOPLE P WHERE LEFT(comm.LONG_COMM_LINE_1, CHARINDEX('-',
comm.LONG_COMM_LINE_1) - 2) LIKE P.Name))
您可以将这些名称存储在临时表中,然后使用临时表的WHERE in子查询将它们放在临时表/表变量中,您可以使用LIKE进行内部联接。这似乎不适合使用,请尝试移动到WHERE。谢谢提示!我忘了提到我没有创建临时表的权限-查询失败:声明@PEOPLE表名varchar128中的OAs;插入@PEOPLE值“%BRIAN%MILLER%”、“%LATEASHA%CALVERT%”、“%CHERITA%MARTIN%”……另一个选项是使用多次引用的CTE。唯一的问题是,它只能用于该语句。是的,CTE也是一个选项。但是我想如果这个表会有很长的使用寿命,就像马克在评论中暗示的那样,如果有人离开这个团队,或者被加入,我不想更新5个地方的名单,那么我会诚实地把它放在一个普通的表中。CTE和TABLE变量几乎暗示它是一次性的,但这条评论告诉我它不是。