Запрос не показывает ожидаемые результаты для случая - PullRequest
0 голосов
/ 02 апреля 2020

Я довольно плохо знаком с более продвинутым SQL, и я тестирую хранимую процедуру, удаляя часть хранимой процедуры и просматривая промежуточные результаты.

Я вижу, что мои MemInd результаты не показывать SF, MF и т. д. c, как ожидалось.

BEGIN
SELECT DISTINCT 
    UMC.CID, UMC.CONCEPT_ID, UMC.STR_VALUE, M.TITLE, M.VF_01
INTO
    #UMC_TMP
FROM 
    DB_DEV..U_MEMBER_CONCEPT UMC WITH (NOLOCK)
LEFT JOIN 
    DB_DEV..MEMBER M WITH (NOLOCK) ON M.CID = UMC.CID AND M.TITLE = 'RR'
WHERE 
    UMC.concept_id = 501


SELECT 
    T.CID, T.STR_VALUE, T.TITLE, T.VF_01,
    CASE 
       --nullif returns null if 2 expressions equal, otherwise return first  expression
       --isnull returns second value if first value/expression is null; otherwise return first value/expression
       WHEN T.TITLE = 'RR' AND (T.STR_VALUE IS NULL OR T.STR_VALUE = '') 
          THEN ISNULL(NULLIF(T.TITLE, T.VF_01), NULL) -- Title is RR, no member in concept
       WHEN T.TITLE = 'RR' AND T.STR_VALUE IS NOT NULL 
          THEN 'ERROR'   -- ISNULL(NULLIF(T.TITLE,T.VF_01),NULL) -- Title is RR, member ind has a value
       WHEN (T.TITLE <> 'RR' OR T.TITLE IS NULL) AND T.STR_VALUE IS NOT NULL AND T.STR_VALUE IN ('SF', 'MF') 
          THEN T.STR_VALUE    -- This is not returning SF/MP per MemInd col. --ISNULL(NULLIF(T.STR_VALUE,T.VF_01),NULL) -- Title is not RR, member ind has a value
       WHEN T.TITLE <> 'RR' AND (T.STR_VALUE IS NULL OR T.STR_VALUE ='') 
          THEN NULL     -- Title is not RR, no member ind concept
       -- WHEN T.TITLE <> 'RR' AND T.STR_VALUE = '' THEN NULL -- Title is not RR, no member ind concept
       ELSE NULL
    END MemInd
INTO 
    #UPDATES
FROM 
    #UMC_TMP T


SELECT * FROM #UPDATES --this is not showing SF/MF in MemIndicator as expected

DROP TABLE #UMC_TMP
DROP TABLE #UPDATES
GO

UMC_TMP:

CID    CONCEPT_ID     STR_VALUE     TITLE     VF_01 
376        501         SF             NULL     NULL 
443        501         SF             NULL NULL 
605        501         MF             NULL     NULL 
550        501                        RR       RR 
876        501                        RR       RR 
970        501                        RR       RR 
183        501                        RR       RR 
726        501                        RR       RR 
542        501                        RR       RR

Таблица #UPDATES выглядит следующим образом, которая имеет значение NULL в MemInd полностью вниз (обновлено теперь для Note3). Я ожидал бы SF или MF там, или RR

CID    STR_VALUE      TITLE   VF_01    MemInd
---------------------------------------------

550                   NULL     NULL      NULL 
876                   NULL     NULL      NULL 
970                   NULL     NULL      NULL 
183                   NULL     NULL      NULL 
726                   NULL     NULL      NULL 
376     SF            NULL     NULL      SF 
443     SF            NULL     NULL      SF 
605     MF            NULL     NULL      MF 
542                   RR       RR        NULL

Таким образом, похоже, что оба RR из первого случая не попадают в столбец MemInd, а также SF / MF из STR_VALUE, третий случай, не попадает в столбец MemInd. Есть идеи?

Я не понимаю, почему MemInd из #UPDATES неверен. Буду признателен за любую помощь!

Примечание: я обновил #UPDATES, чтобы показать VF_01. Я думаю, что первый случай в порядке (RR уже установлен в VF_01), , но 3-й случай должен показывать SF / MP / SF47 в MemInd, когда Title <> RR и STR_VALUE не равны нулю. Это не имеет ничего общего с тем, чтобы сделать результаты неясными.

Примечание 2: я добавил результат таблицы UMC_TMP

Примечание 3: я изменил T.TITLE = NULL на T.TITLE IS NULL в 3-м случае, и MemInd теперь кажется правильным. Я обновил таблицу #UPDATES соответствующим образом в вопросе и операторе CASE.

1 Ответ

0 голосов
/ 03 апреля 2020

За @WillRickards, исправление обсуждалось выше:

WHEN (T.TITLE <> 'RR' OR T.TITLE IS NULL) AND T.STR_VALUE IS NOT NULL AND T.STR_VALUE IN ('SF', 'MF') 
          THEN T.STR_VALUE 
...