2015-10-13 94 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