2013-08-02 110 views
0

的行爲我有一個查詢:更改列的數據類型更改查詢

SELECT [Theme].[PK_Theme], [Theme].[Name], [ThemeType].[Type] 
    FROM [Theme] 
    LEFT OUTER JOIN [ThemeType] 
    ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType] 
    JOIN [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme] 
WHERE ProductTheme.ProductID LIKE '%' 
    AND ProductTheme.ThemeId = Theme.PK_Theme 
    AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%' 
GROUP BY [Theme].[Name], [ThemeType].[Type], [Theme].[PK_Theme] 
ORDER BY CASE WHEN [ThemeType].[Type] IS NULL THEN 0 ELSE 1 END, [Theme].[Name] 

的原因LIKE s爲有因爲'%'使用asp.net服務器控件實際上是參數化。

這個查詢結果如下:

enter image description here

你不能看到所有返回的數據,但[Theme].[Name]是按字母順序排列兩個部分,第一個內,其中[ThemeType].[Type]NULL那麼它不爲空。 [Theme].[PK_Theme]是與[Theme].[Name]關聯的主鍵。

表的關聯方式是該主題有一個名爲ThemeTypeId的列,它是ThemeType表中主鍵的外鍵。

現在這是我的問題,目前ThemeTypeIdVARCHAR(50)數據類型,我需要它是INT。我看到的問題是:

COALESCE([THEME].[THEMETYPEID], 'null') 

這將導致以下錯誤:varchar價值'NULL'轉換爲數據類型int

轉換失敗。

但是,如果我將null更改爲NULL則不返回任何內容,如果將其更改爲0,則只返回如上所述返回的NULL和非空值。我該怎麼做呢?

+0

在合併之後,即使它是一個int,你仍然在放置'like'%'嗎? –

+0

目前,是...這是不正確的?你將如何返回所有值在整數 –

+0

我會想出一個可能的答案,但不知道你的服務器控制,我懷疑我會第一次100%得到它;隨時提出改進意見。 –

回答

1

最明顯的事情是從where條款刪除行

AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%' 

like正在執行is not null,並且您正在轉換NULL值。所以這條線是不需要的。

如果你不能這樣做,你能做到這一點嗎?

AND COALESCE(cast([THEME].[THEMETYPEID] as varchar(255)), 'null') LIKE '%' 

或者這個?

AND [THEME].[THEMETYPEID] is not null 
+0

AND COALESCE(cast([THEME]。[THEMETYPEID] as varchar(255)),'null')LIKE'%'完美並且當前與我的服務器控件的功能一起工作。 –

1

如果你使用一個int,而不是一個varchar,您需要更改以下行:

AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%' 

喜歡的東西

AND COALESCE([THEME].[THEMETYPEID], 0) = 0% 

這假定%簡單地通過更換當提供一個數值時,空值爲空。如果比這更復雜,那麼'%'可能需要在此查詢中出現多次(您的控件可能不支持)。