使用 IN 语句的 Where 子句中的 Case 语句

轴瓦克

不确定这是否可行,但我想根据某些条件在 IN 语句中指定一个选择查询。这是我的 SQL 查询:

SET @DepartmentId = (SELECT TOP 1 DepartmentId FROM Organisations WHERE OrganisationId = @OrgId)

CREATE TABLE #JustificationDetails
(
    JustificationId INT,
    Code VARCHAR(5),
    AccCategory CHAR(2),
    Description VARCHAR(200),
    ActualTotals DECIMAL(18, 2),
    CurrentTotals DECIMAL(18, 2),
    FutureTotals DECIMAL(18, 2),
    IncreaseDecreaseTotals DECIMAL(18, 2),
    IncreaseDecreasePerc INT,
    Justification VARCHAR(MAX)
)

INSERT INTO #JustificationDetails
    SELECT 
        ISNULL(J.pkiJustificationId, 0), 
        RIGHT(A.AccountNumber, 5) AS AccVote, 
        LEFT(RIGHT(A.AccountNumber, 5), 2) AS AccCategory, 
        A.Description, 
        0, 0, 0, 0, 0,
        ISNULL(J.JustificationReason, '''')
    FROM 
        Accounts A 
    INNER JOIN 
        Notes_Line_Entries NLE ON A.AccountId = NLE.fkiAccountId
    INNER JOIN 
        MasterBudgets MB ON NLE.budgetId = MB.BudgetId
    INNER JOIN 
        Organisations O ON MB.OrganisationId = O.OrganisationId
    LEFT JOIN 
        Justifications J ON O.OrganisationId = J.fkiOrganisationId
    WHERE 
        fkiNotesColumnId = 3 
        AND O.OrganisationId IN (CASE
                                    WHEN @DepartmentId = 2 
                                       THEN (SELECT OrganisationId FROM Organisations
                                             WHERE ParentOrganisationId IN (SELECT OrganisationId 
                                                                                            FROM Organisations 
            WHERE ParentOrganisationId IN (SELECT OrganisationId 
                                           FROM Organisations 
                                           WHERE ParentOrganisationId = @OrgId)))
                                    WHEN @DepartmentId = 4 
                                       THEN (SELECT OrganisationId FROM Organisations
                                             WHERE ParentOrganisationId IN (SELECT OrganisationId 
            FROM Organisations 
            WHERE ParentOrganisationId IN (SELECT OrganisationId 
                                           FROM Organisations 
                                           WHERE ParentOrganisationId = @OrgId)))
                                    WHEN @DepartmentId = 3 
                                       THEN (SELECT OrganisationId 
                                             FROM Organisations 
                                             WHERE ParentOrganisationId IN (SELECT OrganisationId 
           FROM Organisations 
           WHERE OrganisationId = @OrgId))
                                    WHEN @DepartmentId = 5 
                                       THEN (SELECT OrganisationId
                                             FROM Organisations 
                                             WHERE ParentOrganisationId IN (SELECT OrganisationId 
           FROM Organisations 
           WHERE OrganisationId = @OrgId))
                                 END)
GROUP BY 
    J.pkiJustificationId, A.Category, A.Description, 
    RIGHT(A.AccountNumber, 5), J.JustificationReason
ORDER BY 
    A.Category, RIGHT(A.AccountNumber, 5)

我收到以下错误:

子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。

如果我在 IN() 语句中只运行一个选择查询,那么它就可以工作,所以我只是假设这是不可能的?

谢谢你的帮助。

福帕斯

CASE 语句不能返回数据集,因此它不能与 IN 子句一起使用。
我认为你的代码逻辑可以这样写:

WHERE fkiNotesColumnId = 3 AND (      
  (
    @DepartmentId IN (2, 4) AND 
    O.OrganisationId IN (
      SELECT OrganisationId FROM Organisations
      WHERE ParentOrganisationId IN (
        SELECT OrganisationId FROM Organisations 
        WHERE ParentOrganisationId IN (
          SELECT OrganisationId FROM Organisations 
          WHERE ParentOrganisationId = @OrgId
        )
      )
    )
  )
  OR
  (
    @DepartmentId IN (3, 5) AND 
    O.OrganisationId IN (
      SELECT OrganisationId FROM Organisations 
      WHERE ParentOrganisationId IN (
        SELECT OrganisationId FROM Organisations 
        WHERE OrganisationId = @OrgId
      )
    )
  )
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章