単一の列の NULL を特定の値COALESCE
に置き換えるために使用します。結果表で行なし条件を指定しないために使用します。あなたが望むのは次のようです: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 の使用が単純に構文糖衣になるのか、それとも実際に関数を 1 回だけ評価するように強制するのかはわかりません。他の誰かがこれを調査し、適切な回答を提供できます:)