Nosso aplicativo às vezes precisa criar consultas SQL dinamicamente, incluindo ORDER BY
cláusulas semelhantes a esta:
ORDER BY CASE t.ID
WHEN 895 THEN 1
WHEN 643 THEN 2
END
O problema t.ID
geralmente se refere a NUMBER
colunas — mas raramente se refere a VARCHAR
colunas (dependendo da tabela, que é, para lembrar, dinâmica).
Quando isso acontece, recebemos um erro como este (abaixo está a versão localizada, mas é fácil de descobrir):
Erro SQL [932] [42000]: ORA-00932: Não há tipos de dados: ожидается CHAR, получено NUMBER
Embora nosso RDBMS possa executar conversão implícita de tipo , aparentemente não funciona com WHEN
(por algum motivo). Não encontrei nenhuma menção a isso nos documentos (você é bem-vindo para fornecer tal referência).
Aqui estão os scripts de reprodução (o exemplo é reconhecidamente rebuscado):
create table "user"(
id VARCHAR(50),
name VARCHAR(50)
);
insert into "user"
values ('1', 'John Doe'),
('2', 'John Roe'),
('3', 'Jane Doe');
select * from "user"
order by case id
when 1 then 1
when 2 then 2
end;
Substitua o último script por este para que funcione
select * from "user"
order by case id
when '1' then 1
when '2' then 2
end;
Qual é a sua recomendação¹?
Oracle DB, Postgres (usamos ambos).
¹ Além de "nunca confie na conversão implícita de tipos"