SQL --case的應用

需求:獲取用戶A和用戶B的關係(關係包括:關注(00)、被關注(01)、相互關注(02)、無任何關係(該條記錄不存在))前端

接口:{Host}/getUserHomePageInfo/userIdA/userIdBjava

數據庫表顯示sql


由數據庫設計可知:數據庫

1000000006能夠在A位置,也能夠在B位置。即以下兩條是同一個意思,都是1000000006關注1000000005數據庫設計

1000000006   1000000005    00設計

1000000005   1000000006    01code

同時也說明,上述兩條數據不可能同時存在在數據庫。接口

現在的需求是查找06和05的關係get

傳入參數:userIdA和userIdB
io

傳出參數:flag

思路:

1.先用userIdA和userIdB去查詢有沒有這條記錄,若是沒有,則flag='xx'

SELECT
    USER_ID_A,
    CASE count(*)
WHEN 0 THEN
    'xx'
ELSE
    tuf.FOLLOW_FLAG
END as flag
FROM
    t_user_follow tuf
WHERE
    (
        USER_ID_A = 1000000006
        AND USER_ID_B = 1000000005
    )
OR (
    USER_ID_A = 1000000005
    AND USER_ID_B = 1000000006
)

2.有關係的話,將取出來的USER_ID_A與傳入的參數userIdA比較,

2-1 若是相等,則說明userIdA在A位置,則取出來的flag直接顯示

2-2 若是不等,則說明userIdA在B位置,

2-2-1 若是取出來的值爲'01',則說明A關注B,此時返回給前端的應該是'00'

2-2-2 其餘值,直接顯示

SQL以下

傳進來的值:userIdA:1000000006,userIdB:1000000005

SELECT
    CASE tall.USER_ID_A
    WHEN 1000000006 THEN
    (
        SELECT
            #userIdA在數據庫A位置,flag直接顯示
            tuf.FOLLOW_FLAG
        FROM
            T_USER_FOLLOW AS tuf
        WHERE
            (
                USER_ID_A = 1000000006
                AND USER_ID_B = 1000000005
            )
    )
    ELSE
    (
        SELECT
            CASE tuf.FOLLOW_FLAG #userIdA在數據庫B位置,若是flag爲'01',則將其轉成'00'
        WHEN '01' THEN
            '00'
        ELSE
            tuf.FOLLOW_FLAG
        END
        FROM
            T_USER_FOLLOW AS tuf
        WHERE
            (
                USER_ID_A = 1000000005
                AND USER_ID_B = 1000000006
            )
    )
    END AS attentionFlag
FROM
    t_user_follow tall
WHERE
    (
        USER_ID_A = 1000000006
        AND USER_ID_B = 1000000005
    )
OR (
    USER_ID_A = 1000000005
    AND USER_ID_B = 1000000006
)

項目經理的寫法以下:能夠知足需求,可是沒有數據時,不能返回xx,這個判斷只能到java裏面去判斷

SELECT
    CASE USER_ID_A
WHEN 1000000005 THEN
    CASE tuf.FOLLOW_FLAG
WHEN '01' THEN
    '00'
WHEN '00' THEN
    '01'
ELSE
    tuf.FOLLOW_FLAG
END
ELSE
    tuf.FOLLOW_FLAG
END AS attentionFlag
FROM
    T_USER_FOLLOW AS tuf
WHERE
    (
        USER_ID_A = 1000000006
        AND USER_ID_B = 1000000005
    )
OR (
    USER_ID_A = 1000000005
    AND USER_ID_B = 1000000006
)

通過認真思考後,我改寫了項目經理的SQL,使能知足沒有數據時,返回'xx'的狀況,SQL以下

SELECT
    CASE count(*)
    #無數據時,返回'xx'
    WHEN 0 THEN 'xx'
    ELSE
        #有數據時,判斷傳進來的userIdB在數據庫的位置
        CASE USER_ID_A
        #userIdB在數據庫A位置
        #查出的關係若是是'01',說明06關注05,返回給前端的應該是'00'
        #查出的關係若是是'00',說明05關注06,返回給前端的應該是'01',即06被05關注
        WHEN 1000000005 THEN
            CASE tuf.FOLLOW_FLAG
                WHEN '01' THEN '00'
                WHEN '00' THEN '01'
                ELSE tuf.FOLLOW_FLAG
            END
        ELSE
        #userIdB在數據庫B位置,則返回的關係不變
        tuf.FOLLOW_FLAG
        END
    END as attentionFlag
FROM
    t_user_follow tuf
WHERE
    (
        USER_ID_A = 1000000006
        AND USER_ID_B = 1000000005
    )
OR (
    USER_ID_A = 1000000005
    AND USER_ID_B = 1000000006
)

總結:最後一次SQL能夠完整的知足最開始的需求。

相關文章
相關標籤/搜索