Запрос принимает две таблицы, выполняет левое соединение, а затем отфильтровывает на основе предпочтений. Однако он работает хорошо, когда я добавляю оператор case, у меня возникают проблемы. Идея заключалась в том, чтобы взять первые цифры, которые мне нужны, чтобы классифицировать их в более широкую категорию. Мне нужно иметь возможность изменить имена полей на что-то дружественное. Какие-либо предложения?
Значения поля tr.TENANT_NAICS имеют следующий формат:
Хотел бы изменить на просто:
Запрос
select
tr.OCCUPANCY_DATE, tr.END_DATE, tr.TENANT_NAICS,
pr.PROPERTY_STATUS, pr.NRA_BUILDING, pr.MARKET, pr.SUBMARKET, pr.FULL_ADDRESS_ONE_LINE,
pr.LEGAL_OWNER, pr.TRUE_OWNER,
lr.LESSOR_SUBLESSOR,
/* trying to fix here */
(case
when left(tr.TENANT_NAICS, 2)::numeric = 11 THEN 'Other Computer Related'
when left(tr.TENANT_NAICS, 2)::numeric = 21 THEN 'Mining'
when left(tr.TENANT_NAICS, 4)::numeric = 4821 THEN 'Construction'
else tr.TENANT_NAICS
end) as "Tenant Industry"
from space.tran tr
left join property pr on tr.ID = pr.ID
left join lease lr on tr.OID = lr.OID
where
tr.STATUS = 'Existing' and tr.MARKET = 'Seattle'
;
Обновлено: я получаю точную ошибку: «Числовое значение «Bu» не распознано».
@NickW Я обновил свой заголовок и включил полученную ошибку. Я просто не уверен, как логика не работает. У меня есть отдельный запрос, который выполняется с использованием аналогичного оператора case, и он отлично работает.
Где-то в вашем столбце TENANT_NAICS
есть запись, которая начинается не с цифры, а со строки Bu
. Итак, вы пытаетесь сделать 'Bu'::numeric
, по сути говоря снежинке преобразовать Bu
в число, и эта команда ей не нравится. Попробуйте использовать TRY_CAST
или TRY_TO_NUMBER
вместо ::numeric
. с ними, если кастинг не удался, он просто вернет NULL
, и ваша логика будет работать.
@JNevil спасибо, я пытался использовать try_cast, но получил эту ошибку «Ошибка компиляции SQL: функция TRY_CAST не может использоваться с аргументами типов BOOLEAN и NUMBER (2,0)». Вот как выглядело мое утверждение (CASE WHEN TRY_CAST((left(tr.TENANT_NAICS, 2) = 11) as int) THEN 'Сельское хозяйство, лесоводство, рыболовство и охота' ELSE tr.TENANT_NAICS END) как "Tenant Industry"
По-видимому, TENANT_NAICS — это столбец varchar, и должно быть хотя бы одно значение, начинающееся с BU вместо цифр. Попробуйте этот SQL:
select
tr.OCCUPANCY_DATE, tr.END_DATE, tr.TENANT_NAICS,
pr.PROPERTY_STATUS, pr.NRA_BUILDING, pr.MARKET, pr.SUBMARKET, pr.FULL_ADDRESS_ONE_LINE,
pr.LEGAL_OWNER, pr.TRUE_OWNER,
lr.LESSOR_SUBLESSOR,
/* trying to fix here */
(case
when left(tr.TENANT_NAICS, 2) = '11' THEN 'Other Computer Related'
when left(tr.TENANT_NAICS, 2) = '21' THEN 'Mining'
when left(tr.TENANT_NAICS, 4) = '4821' THEN 'Construction'
else tr.TENANT_NAICS
end) as "Tenant Industry"
from space.tran tr
left join property pr on tr.ID = pr.ID
left join lease lr on tr.OID = lr.OID
where
tr.STATUS = 'Existing' and tr.MARKET = 'Seattle'
;
Ух ты, подумал я, потому что первые извлеченные символы были числами, которые нужно было преобразовать в числовые. Спасибо вам за помощь!
Что ж... это имеет гораздо больше смысла, чем try_cast
я предложил.
С какими проблемами вы сталкиваетесь при использовании инструкции CASE? Пожалуйста, обновите свой вопрос, указав логику/правила, которые вы пытаетесь реализовать, если они не совпадают с вашим оператором CASE.