2013-05-27 24 views
2

我想在select語句中的where子句中使用convert。我的查詢看起來是這樣的:SQL Server中的sql與轉換

SELECT DISTINCT TOP 10 [SurveyResult].* 
         ,[Ticket].[RefNumber] 
FROM [SurveyResult] 
LEFT JOIN [Ticket] ON [SurveyResult].[TicketID] = [Ticket].[TicketID] 
JOIN [SurveyResponse] AS SurveyResponse1 ON [SurveyResult].[ResultID] = SurveyResponse1.[ResultID] 
JOIN [QuestionAnswer] AS QuestionAnswer1 ON SurveyResponse1.[AnswerID] = QuestionAnswer1.[AnswerID] 
JOIN [SurveyQuestion] AS SurveyQuestion1 ON QuestionAnswer1.[QuestionID] = SurveyQuestion1.[QuestionID] 
WHERE SurveyQuestion1.[SurveyID] = [SurveyResult].[SurveyID] 
    AND SurveyQuestion1.[QuestionID] = 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016' 
    AND CONVERT(INT, SurveyResponse1.[Response]) >= 1 
    AND CONVERT(INT, SurveyResponse1.[Response]) <= 5 

問題是,我在將值轉換爲where語句中的整數時出現一些錯誤。

我知道我有不包含在響應列數了一些行,但我這樣過濾那些沒有在where子句中的轉換部分我只得到號碼,它的工作原理是這樣的:

SELECT TOP 1000 [ResponseID] 
    ,[ResultID] 
    ,[Response] 
    FROM [WFSupport].[dbo].[SurveyResponse] 
    JOIN QuestionAnswer ON SurveyResponse.AnswerID = QuestionAnswer.AnswerID 
WHERE QuestionAnswer.QuestionID = 'C10BF42E-5D51-46BC-AD89-E57BA80EECFD' 

在結果中我得到數字,但是一旦我在語句中添加了轉換部分,就會出現一個錯誤,它無法將某些文本轉換爲數字。

+0

您使用的是哪個版本的SQL Server? –

+0

2008年,我的印象是,sql server短路評估爲這種情況:QuestionAnswer.QuestionID ='C10BF42E-5D51-46BC-AD89-E57BA80EECFD'會在轉換它們之前過濾數字,但它不起作用 – Alecu

+0

請檢查[本文的短路部分](http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx)。 –

回答

4

或者像Mark說的那樣或者只是將NULL值默認爲某些數值,這個w烏爾德 - 給你一個WHERE語句,如:

WHERE SurveyQuestion1.[SurveyID] = [SurveyResult].[SurveyID] 
    AND SurveyQuestion1.[QuestionID] = 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016' 
    AND CONVERT(INT, ISNULL(SurveyResponse1.[Response],0)) BETWEEN 1 AND 5 

的重要組成部分,是ISNULL()函數,我也用之間避免重複轉換。

0

嘗試這一個 -

SELECT DISTINCT TOP 10 sr.*, t.[RefNumber] 
FROM dbo.SurveyResult sr 
JOIN dbo.SurveyResponse sr2 ON sr.[ResultID] = sr2.[ResultID] 
JOIN dbo.QuestionAnswer sa ON sr2.[AnswerID] = sa.[AnswerID] 
JOIN dbo.SurveyQuestion sq ON sa.[QuestionID] = sq.[QuestionID] AND sq.[SurveyID] = sr.[SurveyID] 
LEFT JOIN dbo.Ticket t ON sr.[TicketID] = t.[TicketID] 
WHERE sq.[QuestionID] = 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016' 
    AND CAST(ISNULL(sr2.[Response], 0) AS INT) BETWEEN 1 AND 5 
2

嘗試:

SELECT DISTINCT TOP 10 
      [SurveyResult].*, 
      [Ticket].[RefNumber]   
     FROM 
      [SurveyResult] 
     LEFT JOIN [Ticket] ON [SurveyResult].[TicketID] = [Ticket].[TicketID] 
     JOIN [SurveyResponse] AS SurveyResponse1 
      ON [SurveyResult].[ResultID] = SurveyResponse1.[ResultID] 
     JOIN [QuestionAnswer] AS QuestionAnswer1 
      ON SurveyResponse1.[AnswerID] = QuestionAnswer1.[AnswerID] 
     JOIN [SurveyQuestion] AS SurveyQuestion1 
      ON QuestionAnswer1.[QuestionID] = SurveyQuestion1.[QuestionID] 
    where SurveyQuestion1.[SurveyID] = [SurveyResult].[SurveyID] 
     AND SurveyQuestion1.[QuestionID] = 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016' 
     AND CASE SurveyQuestion1.[QuestionID] 
       WHEN 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016' 
       THEN Convert(int, SurveyResponse1.[Response]) 
       ELSE 0 
      END BETWEEN 1 AND 5 

(該AND SurveyQuestion1.[QuestionID] = 'C86CB39A-8FE0-4FE8-B38F-17F1BE611016'被保持在殼體查詢被上QuestionID使用索引 - 如果不是,它可以被去除,因爲相同的條件隱含在後續的CASE條件中。)