更改列的数据类型会更改查询的行为

时间:2013-08-02 13:51:20

标签: asp.net sql sql-server

我有一个问题:

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存在的原因是因为'%'实际上是使用asp.net服务器控件进行参数化的。

此查询会产生以下结果:

enter image description here

您无法看到所有返回的数据,但[Theme].[Name]在两个段中按字母顺序排列,其中[ThemeType].[Type]NULL,而非{null}。 [Theme].[PK_Theme]是与[Theme].[Name]关联的主键。

表的关联方式是Theme有一个名为ThemeTypeId的列,它是ThemeType表上主键的外键。

现在这是我的问题,目前ThemeTypeId属于VARCHAR(50)数据类型,我需要INT。我看到的问题是:

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

这会导致以下错误:

varchar'NULL'转换为数据类型int时转换失败。

但是,如果我将null更改为NULL则不会返回任何内容,如果我将其更改为0,则只返回NULL's are returned. I need both NULL`并返回非Null,如上所述。我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果您使用的是int而不是varchar,则需要更改以下行:

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

类似

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

这假设%在提供一个时简单地被数值替换,而空为空。如果比这更复杂,'%'可能需要在此查询中出现多次(您的控件可能不支持)。

答案 1 :(得分:1)

显而易见的是删除行

AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%'
来自where子句的

like正在执行is not null,无论如何您正在转换NULL值。所以不需要这条线。

如果你不能那样做,你可以这样做吗?

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

还是这个?

AND [THEME].[THEMETYPEID] is not null