2009-07-10 3 views
3

У меня есть SQL заявление, как это:Набор символов несовпадение

SELECT 
    a.ColumnA, b.ColumnB || 
CASE WHEN TRIM(c.ColumnC) IS NOT NULL THEN ' (' || c.ColumnC || ')' ELSE '' END AS ClassName 
FROM TableA a INNER JOIN TableB b ON a.SomeColumn = b.SomeColumn 
INNER JOIN TableC c on a.SomeCol = c.SomeCol 

я получаю ошибку «Character установить несоответствие» в «ELSE„“» часть выражения CASE. Может кто-нибудь предложить, где я делаю это неправильно? Спасибо.

+0

Как определяются столбцы ColumnB и ColumnC? Работает ли запрос без предложения ELSE? – Plasmer

+0

Нет проблем с оператором (предположим, что последнее соединение также относится к a, b SomeColumn, и вы просто сократили имя столбца). Не могли бы вы обновить вопрос с информацией о наборе символов базы данных? – dpbradley

+2

Я нашел ответ. Нам нужно CAST часть ELSE с тем же типом, что и ColumnC. Может быть, он знает тип данных результата выражения CASE. Итак, это: CASE WHEN ...... ELSE CAST ('' AS NVarchar2 (1)) END – 2009-07-10 14:55:17

ответ

0

Вы пытались заменить '' на NULL? Также попробуйте полностью удалить часть ELSE, потому что она вернет NULL в любом случае.

+0

Намерение добавить значение из ColumnC, если существует, в ColumnB. Если я заменил часть ELSE на NULL, тогда все значение станет NULL (b.ColumnB || NULL = NULL), и я не хочу этого. – 2009-07-10 14:51:05

+0

Неправда. выберите 'a' || null из double; возвращает 'a' – jva

+0

Кроме того, пустая константа строки ('') - это всего лишь способ записи «to_char (NULL)». – jva

2

Вы не можете объединить значения VARCHAR и NVARCHAR без инструкции CAST.

1
CASE WHEN TRIM(c.ColumnC) IS NOT NULL 
    THEN ' (' || c.ColumnC || ')' 
    ELSE N'' END A 

- более сжатое решение. N '' дает пустую строку в unicode

0

Просто удалите ELSE, упростите чтение кода

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