1

INキーワードを使用して、パラメーターに存在するかどうかに応じてレコードを選択するデータベースから結果を選択したい:

SELECT * FROM report_view
WHERE project_id = 1
AND versionName IN (SELECT LTRIM(string) COLLATE DATABASE_DEFAULT FROM [dbo].[func_ParseString](@milestoneInput))

COALESCEこれは正常に機能しますが、IN ステートメントで何も返されない場合は、キーワードを使用してすべてを元に戻したいと考えています。

これを行う方法はありますか?

4

2 に答える 2

0

existsこれは、すべてのロジックを句に入れる代替手段です。

アイデアは、ウィンドウ関数を使用して一致があるかどうかを確認し、特定の文字列が一致するかどうかを判断することです。

SELECT *
FROM report_view 
WHERE project_id = 1 and
      exists (select 1
              from (SELECT sum(case when ltrim(ps.string) = rv.VersionName then 1 else 0
                               end) over () as NumMatches,
                           (case when ltrim(ps.string) = rv.VersionName then 1 else 0
                            end) as IsMatch
                    FROM [dbo].[func_ParseString](@milestoneInput) ps
                   ) t
              where IsMatch = 1 or NumMatchs = 0
             )

キーはwhere、値が一致するか、リストに一致しない場合に true を返すように指示する句です。

于 2013-07-12T11:51:19.453 に答える
0

単一の列の 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 回だけ評価するように強制するのかはわかりません。他の誰かがこれを調査し、適切な回答を提供できます:)

于 2013-07-12T10:48:52.750 に答える