Попытка понять SQL, где предложение - PullRequest
3 голосов
/ 10 августа 2010

Я надеюсь, что кто-то может помочь интерпретировать последнюю строку кода (@ Active = 1 ....) для этого предложения SQL:

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)  

Я сталкивался с таким кодом, только он не содержится в "IF" блоке

Ответы [ 2 ]

3 голосов
/ 10 августа 2010

Более легко понять, когда переписано как

(@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, чтобы увидеть, совпадают ли результаты?

1 голос
/ 10 августа 2010

Не уверен, что 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 и неактивную дату, чтобы убедиться, что если статус активный, то неактивный имеет значение null и наоборот.

...