用于将单个列COALESCE
中的 NULL 替换为给定值。用于在结果表中指定无无行条件。看起来你想要的是:NOT EXISTS
SELECT * FROM report_view
WHERE project_id = 1
AND (
versionName IN (
SELECT LTRIM(string) COLLATE DATABASE_DEFAULT
FROM [dbo].[func_ParseString](@milestoneInput)
)
OR NOT EXISTS (
SELECT 1
FROM report_view
WHERE project_id = 1
AND versionName IN (
SELECT LTRIM(string) COLLATE DATABASE_DEFAULT
FROM [dbo].[func_ParseString](@milestoneInput)
)
)
)
我不确定这会调用你的函数多少次。UNION ALL
使用 a而不是以下内容可能会更好OR
:
;WITH VersionNames AS (
SELECT LTRIM(string) COLLATE DATABASE_DEFAULT AS versionName
FROM [dbo].[func_ParseString](@milestoneInput)
)
SELECT *
FROM report_view
WHERE project_id = 1
AND versionName IN (SELECT versionName from VersionNames)
UNION ALL
SELECT *
FROM report_view
WHERE project_id = 1
AND NOT EXISTS
(
SELECT 1
FROM report_view
WHERE project_id = 1
AND versionName IN (SELECT versionName from VersionNames)
)
我不确定使用 CTE 是仅仅相当于语法糖还是实际上强制函数只被评估一次;其他人可以对此进行调查并提供正确的答案:)