CASE с переменным и статическим откликом

Я пытаюсь сформировать оператор CASE, который будет генерировать фиксированный ответ, если критерии соблюдены, или будет отвечать значением в поле. Я получаю сообщение «800: соответствующие типы данных должны быть совместимы в выражении CASE или функции DECODE». ошибка при выполнении запроса. Насколько я понимаю, это вызвано несовпадением типов ответов, несоответствием формата. Однако ответ f.frequency представляет собой 9-значное целое число, если оно не равно нулю (поэтому тип f.frequency — INTEGER).

Это работает:

CASE
    WHEN f.frequency is null AND d.appid = 7 THEN '999000000'
    ELSE null
    END AS frequency,

Или это

CASE
    WHEN f.frequency is not null THEN f.frequency
    ELSE null
    END AS frequency,

но не тогда, когда я объединяю их, как в

CASE
    WHEN f.frequency is null AND d.appid = 7 THEN '999000000'
    WHEN f.frequency is not null THEN f.frequency
    ELSE null
    END AS frequency,

или вот так

CASE
    WHEN f.frequency is null AND d.appid = 7 THEN '999000000'
    ELSE f.frequency
    END AS frequency,

person cw2    schedule 03.01.2017    source источник
comment
Проблема в том, что я думаю, что f.frequency и «999000000» имеют разные типы данных. Возможно, f.frequency содержит больше символов, чем «999000000». Измените порядок регистра, например: СЛУЧАЙ, КОГДА f.частота не равна нулю, ТОГДА f.частота, КОГДА f.частота равна нулю, И d.appid = 7, ТОГДА '999000000' ИНАЧЕ, ноль КОНЕЦ КАК частота,   -  person PeterRing    schedule 03.01.2017
comment
Добро пожаловать в Stack Overflow. Обратите внимание, что предпочтительный способ сказать «спасибо» здесь — проголосовать за хорошие вопросы и полезные ответы (если у вас достаточно репутации для этого) и принять наиболее полезный ответ на любой заданный вами вопрос (что также дает вы немного повышаете свою репутацию). См. страницу О, а также Как мне задавать вопросы здесь? и Что мне делать, когда кто-то отвечает на мой вопрос?   -  person Jonathan Leffler    schedule 03.01.2017
comment
В первых двух примерах единственными типами являются либо строка, либо целочисленное значение частоты, плюс NULL, который может быть любого необходимого типа. Вы сталкиваетесь с проблемами, когда у вас есть два разных типа плюс нуль, который не может быть легко разрешен. Если вам нужно 9-значное целое число, используйте обозначение 9-значного целого числа без кавычек. Если вам нужна строка из 9 символов, вы можете преобразовать частоту в строку: например, CAST(f.frequency AS CHAR(9)). Это также решило бы проблему.   -  person Jonathan Leffler    schedule 03.01.2017


Ответы (1)


Из ошибки я понимаю, что "999000000" и f.frequency - это разные типы данных.

Приведение «999000000» к любому типу данных вашего столбца частоты должно помочь.

Также (по крайней мере, в postgres) «999000000» не является целым числом, поэтому вы можете просто удалить кавычки.

person bouletta    schedule 03.01.2017