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]

存在 s的原因LIKE是因为 s'%'实际上是使用 asp.net 服务器控件进行参数化的。

此查询结果如下:

在此处输入图像描述

您看不到所有返回的数据,但[Theme].[Name]在两个段中按字母顺序排列,第一个在哪里[ThemeType].[Type]NULL然后它不为空。[Theme].[PK_Theme]是与 关联的主键[Theme].[Name]

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

现在这是我的问题,目前ThemeTypeIdVARCHAR(50)数据类型,我需要它是INT. 我看到问题是:

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

这会导致以下错误:

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

但是,如果我更改null为空NULL,则返回任何内容,如果我将其更改为 0,则仅NULL's are returned. I need both返回 NULL` 和非 Null,如前面完成的那样。我该怎么做呢?

4

2 回答 2

1

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

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

类似于

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

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

于 2013-08-02T14:03:40.140 回答
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
于 2013-08-02T14:05:05.690 回答