Сначала ответьте на вопрос «почему?»:
Ваш подзапрос не является коррелированным подзапросом . Нет связи с текущей строкой из внешнего SELECT
. Таким образом, при условии, что по крайней мере 1 строка удовлетворяет вашему условию - это всегда даст count>0
.
Хотя ваш подход можно исправить, я бы предложил использовать XML-метод .exist()
и предоставить фильтр как XPath/XQuery
:
SELECT *
FROM Requests r
WHERE r.FlowDetailParameter.exist(N'/ArrayOfFlowDetailParameters
/FlowDetailParameters[(DepartmentId/text())[1]=3
and (Status/text())[1]="Pending"]')=1;
Это проверит наличие любого <FlowDetailParameters>
для данного условия.
Если вы хотите ввести фильтр динамически, вы можете использовать sql:variable()
или sql:column()
вместо 3
и "Pending"
DECLARE @depId INT=3;
DECLARE @status VARCHAR(100)='Pending';
SELECT *
FROM Requests r
WHERE r.FlowDetailParameter.exist(N'/ArrayOfFlowDetailParameters
/FlowDetailParameters[(DepartmentId/text())[1]=sql:variable("@depId")
and (Status/text())[1]=sql:variable("@status")]')=1