Выполнение оператора CASE с несколькими условиями

Запрос принимает две таблицы, выполняет левое соединение, а затем отфильтровывает на основе предпочтений. Однако он работает хорошо, когда я добавляю оператор case, у меня возникают проблемы. Идея заключалась в том, чтобы взять первые цифры, которые мне нужны, чтобы классифицировать их в более широкую категорию. Мне нужно иметь возможность изменить имена полей на что-то дружественное. Какие-либо предложения?

Значения поля tr.TENANT_NAICS имеют следующий формат:

  1. 543330- Другое, связанное с компьютером | 2782 Наука
  2. 548972- Социальные сети

Хотел бы изменить на просто:

  1. Другое, связанное с компьютером
  2. Другое, связанное с компьютером

Запрос

 
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» не распознано».

С какими проблемами вы сталкиваетесь при использовании инструкции CASE? Пожалуйста, обновите свой вопрос, указав логику/правила, которые вы пытаетесь реализовать, если они не совпадают с вашим оператором CASE.

NickW 08.02.2023 20:35

@NickW Я обновил свой заголовок и включил полученную ошибку. Я просто не уверен, как логика не работает. У меня есть отдельный запрос, который выполняется с использованием аналогичного оператора case, и он отлично работает.

caveman 08.02.2023 22:01

Где-то в вашем столбце TENANT_NAICS есть запись, которая начинается не с цифры, а со строки Bu. Итак, вы пытаетесь сделать 'Bu'::numeric, по сути говоря снежинке преобразовать Bu в число, и эта команда ей не нравится. Попробуйте использовать TRY_CAST или TRY_TO_NUMBER вместо ::numeric. с ними, если кастинг не удался, он просто вернет NULL, и ваша логика будет работать.

JNevill 08.02.2023 22:05

@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"

caveman 08.02.2023 23:24
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По-видимому, 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' 
;

Ух ты, подумал я, потому что первые извлеченные символы были числами, которые нужно было преобразовать в числовые. Спасибо вам за помощь!

caveman 09.02.2023 17:10

Что ж... это имеет гораздо больше смысла, чем try_cast я предложил.

JNevill 09.02.2023 17:58

Другие вопросы по теме