(Eu uso o sql server 2015) Na minha tabela de pedidos, o código postal é varchar
.
Eu quero fazer uma pesquisa assim:
SELECT distinct email
FROM [dbo].[tb_Order]
where postalCode in (20004,20528,20260,20529,22060,22181,20708)
(com muitos mais códigos postais)
Não quero ter que converter a lista de códigos em ("20004","20528","20708")
.
Qual a melhor forma de lidar com isto?
Se você estiver realmente usando o Sql Server 2016, provavelmente poderá usar o novo comando STRING_SPLIT para criar uma 'tabela' para ingressar. Basta colocar seus números inteiros delimitados por vírgula no comando STRING_SPLIT. Aqui está um exemplo.
Para a maioria das versões do Microsoft SQL (testadas em 2005+), isso funcionará (usando o banco de dados de demonstração "AdventureWorks" da Microsoft como fonte de laboratório):
O principal problema é que precisamos excluir todas as linhas com PostalCodes que não sejam numéricos (ou seja: canadense, hein?). Caso contrário, obtemos um "Falha na conversão ao converter o valor nvarchar 'K4B 1S2' para o tipo de dados int." erro na seleção acima em execução no AdventureWorks.
A partir do SQL 2012, agora temos TRY_PARSE():
Nota de desempenho: adicionar ISNUMERIC() ou TRY_PARSE() (ou qualquer outro código de conversão) fará com que o SQL Server inspecione cada linha para ver se é válida. Isso pode causar um grande impacto no desempenho em tabelas grandes.
Nota de design: a menos que você tenha 100% de certeza de que só se preocupa com PostalCodes numéricos para sempre, você realmente deve considerar usar o mesmo tipo de dados no IN () da coluna com a qual está testando.