代码之家  ›  专栏  ›  技术社区  ›  user279521

试图理解SQL WHERE子句

  •  3
  • user279521  · 技术社区  · 14 年前

    我希望有人能帮助解释这个SQL子句的最后一行代码(@active=1…..):

    SELECT DISTINCT LOC_ID
        ,LOC_CODE
        ,ADDR_LINE_1
        ,ADDR_LINE_2
        ,ADDR_LINE_3
        ,CITY
        ,STATE
        ,COUNTRY
        ,POSTAL_CODE
        ,COMPANY
        ,OPERATION_TYPE
        ,PROCESS
            ,ADDR_LINE_1 + ',' +ADDR_LINE_2+ ',' + CITY + '-' + COUNTRY + ' ' + POSTAL_CODE AS ADDRESS
            ,COMPANY + '.' + CENTER + '.' + OPERATION_TYPE + '.' + PROCESS AS Proc_Combo
        ,CASE   WHEN INACTIVE_DATE IS NULL THEN 'Active'
            WHEN INACTIVE_DATE IS NOT NULL THEN 'InActive'
        ELSE 'UNKNOWN' END AS INACTIVE_DATE
        ,CASE   WHEN INSTANCE_ID = 1 THEN 'AP' 
            WHEN INSTANCE_ID = 2 THEN 'GAP'     
        ELSE 'ALL' END AS INSTANCE_ID
    FROM HR_Locations
    WHERE
        (@STATE IS NOT NULL AND STATE =@STATE OR @STATE='' AND STATE =STATE OR @STATE IS NULL AND 1=1) 
    AND
        (@ACTIVE=1 AND INACTIVE_DATE IS NULL OR @ACTIVE=2 AND INACTIVE_DATE IS NOT NULL OR @ACTIVE=0 AND 1=1 OR @ACTIVE IS NULL)  
    

    我遇到过这样的代码,只是它不包含在 “如果”

    2 回复  |  直到 14 年前
        1
  •  3
  •   FrustratedWithFormsDesigner    14 年前

    当重写为

    (@ACTIVE=1 AND INACTIVE_DATE IS NULL)
    OR (@ACTIVE=2 AND INACTIVE_DATE IS NOT NULL)
    OR (@ACTIVE=0 AND 1=1)
    OR @ACTIVE IS NULL
    

    我觉得有趣的是 (@ACTIVE=0 AND 1=1) . 本遗嘱 AND 条件 @ACTIVE=0 用价值 TRUE . 在我看来,这可能是个打字错误。我见过这样的事情 (@ACTIVE=0 OR 1=1) 使条件有点“可选”,但在这种情况下,它看起来是不必要的。你能试着运行他们的查询吗? AND 1=1 看看结果是否相同?

        2
  •  1
  •   Andy Evans    14 年前

    不知道1=1是什么意思…

    @ACTIVE=1 AND INACTIVE_DATE IS NULL OR
    @ACTIVE=2 AND INACTIVE_DATE IS NOT NULL OR
    @ACTIVE=0 AND 1=1 OR
    @ACTIVE IS NULL
    

    似乎WHERE子句正在验证@active标志和非活动日期,以确保如果状态为active,则非活动为空,反之亦然。