SQL条件为值

时间:2015-10-13 19:32:18

标签: sql

我有这样的查询:

SELECT Question_ID, Question, department FROM TPM_Questions_Default

现在我需要另一个名为selected的值,这可以是true或false。

我有另一个名为customerQuestions的表,它有一个Question_ID,Customer_ID和选定的值(true或false)

我要做的是返回TPM_Questions_Default中的所有问题,如果Customer_ID的Question_ID存在,则使用所选的,如果它没有标记为选择为false。

我尝试过使用内部联接,但这只返回与customer_ID相关的问题,而不是所有问题。

我希望这是有道理的。

更新

我忘了在这个查询结束时提到它完成后,我需要使用WHERE Customer_ID = 123456来获取值

1 个答案:

答案 0 :(得分:2)

您的描述有点令人困惑,但我认为这就是您想要的。外部联接确保您从TPM_Questions_Default获取所有内容,并且只从customerQuestions获取匹配内容。然后,如果customerQuestions.selected = true,则得到 - 否则,您得到错误(对于不加入Q的行,C.selected将为NULL)

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

此外,我将CustomerID放在选择中,假设question_id可能在customerQuestions中存在多次(对于每个回答的客户)。

SMALL UPDATE:请参阅@ CSL关于使用COALESCE()而不是case语句的评论。相同的一般想法,只是更清晰的语法此外,两者都在某种程度上取决于所选列的数据类型。如果它是一个位值,你将比较并返回0和1(而不是true和false)。而且,当然,如果是字符数据,它将是真实的'并且' false'

另一个更新:

@ 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