2013-08-02 7 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 ы есть происходит потому, что на самом деле '%' параметризованных с помощью управления asp.net сервера.

Результаты Этот запрос в следующем:

enter image description here

Вы не можете увидеть все возвращаемые данные, но [Theme].[Name] в алфавитном порядке в течение двух сегментов, 1, где [ThemeType].[Type] является NULL тогда, когда это не является нулевым. [Theme].[PK_Theme] является основным ключом, связанным с кодом [Theme].[Name].

Способ сопоставления таблиц состоит в том, что тема имеет столбец с именем ThemeTypeId, который является внешним ключом первичного ключа в таблице ThemeType.

Теперь вот моя проблема, в настоящее время ThemeTypeId имеет VARCHAR(50) тип данных, мне нужно это INT. Я вижу, что вопрос:

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

Это приводит к следующей ошибке:

Конверсия удалось при преобразовании значения 'NULL'varchar типу int данных.

Однако, если я не изменить null к NULL ничего не возвращается, если я могу изменить его на 0 только NULL's are returned. I need both NULL` и не Null возвращается, как это было ранее достигнуто выше. Как мне это сделать?

+0

Вы все еще ставите 'как '%'' после объединения, даже если это int? –

+0

в настоящее время, да ... это неверно?Как бы вы вернули все значения в случае с ints –

+0

Я придумаю возможный ответ, но, не зная вашего управления сервером, я сомневаюсь, что я получу его на 100% в первый раз; не стесняйтесь делать предложения по улучшению. –

ответ

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 
+0

И COALESCE (cast ([THEME]. [THEMETYPEID] как varchar (255)), 'null') LIKE '%' отлично работает и в настоящее время работает с тем, как работают мои серверные элементы управления. –

1

Если вы используете Int вместо VARCHAR, вам необходимо изменить следующую строку:

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

к чему-то вроде

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

Это предполагает, что % просто заменяется на числовое значение, когда один поставляется, и пробел для null. Если это сложнее, то в этом запросе может потребоваться «%», который может не отображаться в этом запросе (который ваш элемент управления может не поддерживать).

Смежные вопросы