我有一个问题:
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服务器控件进行参数化的。
此查询会产生以下结果:
您无法看到所有返回的数据,但[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,如上所述。我该怎么做?
答案 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