2015-10-13 95 views
1

我有一個查詢,像這樣:叫選擇SQL如果條件價值

SELECT Question_ID, Question, department FROM TPM_Questions_Default 

現在我需要另一個值給它,這可以是真或假。

我有具有Question_ID,CUSTOMER_ID和選擇的值(true或false)另一個表稱爲customerQuestions

我所試圖做的是返回TPM_Questions_Default如果Question_ID爲CUSTOMER_ID所有的問題存在使用該選中,如果它不標記選中爲false。

我試過使用內部連接,但只返回與customer_ID相關的問題而不是所有問題。

我希望這是有道理的。

UPDATE

我忘了在此查詢的末尾提它做的時候,我將需要使用WHERE CUSTOMER_ID = 123456來獲取值

回答

2

你的描述有點混亂,但我認爲這是你想要的。外部聯接確保您從TPM_Questions_Default獲取所有內容,並且只能從customerQuestions中找到匹配的內容。然後,如果customerQuestions.selected = true時,你得到的 - 否則,你得到錯誤的(C.selected將是NULL對於不加入到q行)

SELECT 
    Q.Question_ID 
    , Q.Question 
    , Q.Department 
    , C.CustomerId 
    , CASE 
     WHEN C.selected = true THEN true 
     ELSE false 
     END AS Selected 
FROM 
    TPM_Questions_Default AS Q 
    LEFT OUTER JOIN 
    customerQuestions AS C ON Q.Question_ID = C.Question_ID 

而且,我把客戶ID的選擇假設question_id可能在customerQuestions中存在多次(對於每個已回答的客戶)。

小型更新:請參閱@ CSL關於使用COALESCE()而不是case語句的評論。同樣的總體思想,只是簡潔的語法。而且,兩者都有些依賴於所選列的數據類型。如果它是一個比特值,你將比較並返回0和1(而不是真和假)。而且,當然,如果是字符數據,這將是「真」和「假」

另一個更新:

@ user979331想添加WHERE CUSTOMER_ID = 1234567因爲CUSTOMER_ID在customerQuestions表,這會將OUTER JOIN轉換爲隱式INNER JOIN。要解決此問題,條件將移動到JOIN下面

SELECT 
    Q.Question_ID 
    , Q.Question 
    , Q.Department 
    , C.Customer_Id 
    , COALESCE(C.selected, 0) AS Selected 
FROM 
    TPM_Questions_Default AS Q 
    LEFT OUTER JOIN 
    customerQuestions AS C ON Q.Question_ID = C.Question_ID AND C.Customer_ID = 1234567 
+1

我會使用COALESE(C.Selected,0)作爲Selected而不是Case語句。 – CSL

+0

@ CSL是的 - 這是更清潔 - thx –

+0

我明白的混亂,我忘記提到的東西,在我使用WHERE Customer_ID = 1234567,我想要的是所選的值(真或假)WHERE Customer_ID = 1234567,同時返回所有問題。在您的解決方案中添加WHERE Customer_ID = 1234567僅返回與Customer_ID相關的問題 – user979331