Estou usando isso há algum tempo:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
No entanto, recentemente, encontrei um problema com colunas com todos os caracteres "0", como '00000000', porque ele nunca encontra um caractere que não seja "0" para corresponder.
Uma técnica alternativa que eu vi é usar TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Isso tem um problema se houver espaços incorporados, porque eles serão transformados em "0" s quando os espaços forem transformados em "0" s.
Estou tentando evitar uma UDF escalar. Encontrei muitos problemas de desempenho com UDFs no SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
fonte
fonte
Respostas:
fonte
Arvo
no SO!Por que você simplesmente não lança o valor
INTEGER
e depois volta paraVARCHAR
?fonte
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
alguns tipos de string ainda falharão nessa conversão. Considere,0001E123
por exemplo.Outras respostas aqui para não levar em consideração se você tiver todos os zero (ou mesmo um único zero).
Alguns sempre usam como padrão uma string vazia como zero, o que é errado quando deveria permanecer em branco.
Releia a pergunta original. Isso responde ao que o Questionador deseja.
Solução 1:
Solução # 2 (com dados de amostra):
Resultados:
Resumo:
Você pode usar o que tenho acima para remover os zero à esquerda.
Se você planeja reutilizá-lo muito, coloque-o em uma função com valor de tabela em linha (ITVF).
Suas preocupações sobre problemas de desempenho com UDFs são compreensíveis.
No entanto, esse problema se aplica apenas às funções All-Scalar e Functions-Table-Multi-Statement-Table.
O uso de ITVFs é perfeitamente adequado.
Eu tenho o mesmo problema com nosso banco de dados de terceiros.
Com os campos alfanuméricos, muitos são inseridos sem os espaços principais, humanos!
Isso impossibilita as junções sem limpar os zeros à esquerda ausentes.
Conclusão:
Em vez de remover os zeros à esquerda, considere apenas preencher os valores aparados com zeros antes de fazer as junções.
Melhor ainda, limpe seus dados na tabela adicionando zeros à esquerda e reconstruindo seus índices.
Eu acho que isso seria MUITO mais rápido e menos complexo.
fonte
Em vez de um espaço, substitua os 0 por um caractere de espaço em branco 'raro' que normalmente não deveria estar no texto da coluna. Um feed de linha provavelmente é bom o suficiente para uma coluna como esta. Então você pode LTrim normalmente e substituir o caractere especial por 0 novamente.
fonte
O seguinte retornará '0' se a sequência consistir inteiramente em zeros:
fonte
Isso faz uma boa função ....
fonte
cast (valor como int) sempre funcionará se string for um número
fonte
Minha versão disso é uma adaptação do trabalho de Arvo, com um pouco mais de acréscimo para garantir outros dois casos.
1) Se tivermos todos os 0s, devemos retornar o dígito 0.
2) Se temos um espaço em branco, ainda devemos retornar um caractere em branco.
fonte
A sugestão de Thomas G funcionou para as nossas necessidades.
O campo no nosso caso já era string e apenas os zeros à esquerda precisavam ser aparados. Principalmente, é tudo numérico, mas às vezes existem letras para que a conversão anterior do INT travasse.
fonte
Isso tem um limite no comprimento da string que pode ser convertida em um INT
fonte
Se você estiver usando o Snowflake SQL, poderá usar o seguinte:
A função ltrim remove todas as instâncias do conjunto designado de caracteres do lado esquerdo.
Portanto, ltrim (str_col, '0') em '00000008A' retornaria '8A'
E rtrim (str_col, '0.') Em '$ 125,00' retornaria '$ 125'
fonte
Funciona bem mesmo com '0', '00' e assim por diante.
fonte
Tente o seguinte:
fonte
Se você não deseja converter em int, prefiro a lógica abaixo, pois ela pode manipular nulos IFNULL (campo, LTRIM (campo, '0'))
fonte
No MySQL você pode fazer isso ...
fonte