Вы не можете использовать значение связанного текста LastFirst
в WHERE
, поскольку "логический" порядок оценки запроса SQL SELECT
на самом деле FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
, поэтому выражения, сделанные в части SELECT
, не отображаютсяне может использоваться нигде, кроме части ORDER BY
(хотя некоторые СУБД, такие как MySQL, допускают использование псевдонимов выражений, концептуально это то же самое, что и использование внешнего запроса).
Я рекомендую не использовать WHERE x IN ( a, b, c, ... )
в вашемпример, потому что это не «правильно» (см. мои заметки ниже относительно ложных срабатываний) - но главным образом потому, что это альтернативное представление оператора OR
, когда вы действительно хотите OR ( x AND y )
.
Я отмечаю, что WHERE IN
обычно вообще не работают с параметрами (так как каждый элемент IN
должен быть своим собственным параметром), вам придется использовать (подверженный SQL-инъекциям) динамический 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' )
)