在SQL WHERE ... IN子句中包含串联字段

时间:2019-05-04 15:27:03

标签: sql ssms

我有一个创建连接字段的SQL语句。然后,如何使用该串联字段作为WHERE ... IN子句的一部分?请参阅下面的代码,目前无法正常工作。当我从第二个“和”向下删除所有内容时,SQL起作用。

SELECT *, a.LastName + a.FirstName as LastFirst
FROM MST_MEMBER_DEMOGRAPHICS as a
WHERE a.GroupID = 'abcCompany'
And 
a.PersonType = 'D'
and 
LastFirst in
('LastName1FirstName1','LastName2FirstName2','LastName3FirstName3',.....etc)

2 个答案:

答案 0 :(得分:1)

您可以重复该表达式,使用子查询或CTE:

hoja1.cell(column=3,row=next_row,value=value.get(pop) 
    ^
SyntaxError: invalid syntax

但是我首选的方法是横向连接:

SELECT md.*, (md.LastName + md.FirstName) as LastFirst
FROM MST_MEMBER_DEMOGRAPHICS md
WHERE md.GroupID = 'abcCompany' AND
      md.PersonType = 'D' AND
      (md.LastName + md.FirstName) IN ('LastName1FirstName1', 'LastName2FirstName2', 'LastName3FirstName3', .....etc)

答案 1 :(得分:1)

您不能在LastFirst中使用串联文本WHERE的值,因为SQL SELECT查询的“逻辑”评估顺序实际上是FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY,因此表达式除了SELECT部分以外,在ORDER BY部分中创建的内容都无法使用(尽管某些RDBMS(如MySQL)确实允许使用表达式别名,从概念上讲,它与使用外部查询相同)。

我建议您在示例中不要使用WHERE x IN ( a, b, c, ... ),因为它不是“正确的”(有关误报,请参见下面的注释),但主要是因为它是OR运算符的替代表示形式真的要OR ( x AND y )

我注意到WHERE IN通常不使用参数(因为每个IN元素成员必须是其自己的参数),您必须使用(SQL-injection-prone)动态SQL,在这种情况下,您应该使用( x = a1 AND y = b1 ) OR ( x = a2 AND y = b2 ) OR ...表达式,因为它们是SARGable,并且可以更快地运行 LOT

(我注意到,在MS SQL Server中,x IN ( a, b, c )的执行计划与( x = a OR x = b OR x = c )相同)。

不执行这样的字符串连接的另一个原因是由于存在假阳性的风险:(警告:人为的例子)假设您有两个人:John SmithJohns Mith-使用您的方法将表示两个人都将匹配其中一个名字的查询。

所以我会这样做:

SELECT
    *,
FROM
    MST_MEMBER_DEMOGRAPHICS AS a
WHERE
    a.GroupID = 'abcCompany'
    AND
    a.PersonType = 'D'
    AND
    (
        ( a.LastName = 'LastName1' AND a.FirstName = 'FirstName1' )
        OR
        ( a.LastName = 'LastName2' AND a.FirstName = 'FirstName2' )
        OR
        ( a.LastName = 'LastName3' AND a.FirstName = 'FirstName3' )
    )
相关问题