我有一个创建连接字段的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)
答案 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 Smith
和Johns 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' )
)