2008-09-18 78 views
76

Estoy trabajando en una consulta SQL que lee desde una base de datos SQLServer para producir un archivo de extracción. Uno de los requisitos para eliminar los ceros a la izquierda de un campo particular, que es un campo simple VARCHAR(10). Entonces, por ejemplo, si el campo contiene '00001A', la instrucción SELECT necesita devolver los datos como '1A'.Eliminación de ceros a la izquierda de un campo en una declaración SQL

¿Hay alguna manera en SQL de eliminar fácilmente los ceros a la izquierda de esta manera? Sé que hay una función RTRIM, pero esto solo parece eliminar espacios.

+2

Como upvote a David Walker http://stackoverflow.com/a/11129399/1635441 respuesta, consulte la respuesta de Arvo publicada: http://stackoverflow.com/a/662437/1635441 – ramizmoh

Respuesta

124
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
+6

Esto tendrá problemas cuando la cadena esté compuesta por completo de "0", ya que nunca coincidirá con un no- "0" personaje. –

+0

Es cierto. Devolverá toda la cadena de ceros sin modificar en este caso. Si esto es un problema, el valor de retorno de patindex tendrá que probarse contra cero. –

+0

Agradable. Gracias – VISQL

2

Si desea que la consulta devuelva un 0 en lugar de una cadena de ceros o cualquier otro valor para el caso se puede convertir esto en un comunicado caso como este:

select CASE 
     WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
     THEN '0' 
     ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
     END 
22
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0') 
+0

Recibí "Reemplazar la función requiere 3 argumentos". Creo que debería leer seleccionar reemplazar (ltrim (replace (ColumnName, '0', '')), '', '0') – brentlightsey

+4

Esto fallará si el valor tiene un espacio en él. Ejemplo: "0001 B" debería convertirse en "1 B" pero se convertirá en "10B" en su lugar. – Omaer

+0

Al igual que @Omaer mencionado, esto no es seguro si hay algunos espacios en la cadena. Solución mejorada: primero, reemplace los espacios con caracteres que es poco probable que entren en la entrada, y después de 0-ltrim, restaure estos caracteres a espacios después. Al final parece bastante complejo :(Ejemplo: seleccionar reemplazar (reemplazar (ltrim (reemplazar (reemplazar ('000309933200,00 USD', '', '|'), '0', ''))), '', '0 '),' | ',' ') -> 309933200,00 USD –

4
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20) 

devuelve N0Z, es decir, se deshace de ceros a la izquierda y todo lo que viene antes que ellos.

+3

¿Cómo es un 0 líder si algo viene antes? – xxbbcc

-1

Para eliminar el 0 principal del mes siguiente declaración sin duda funcionará.

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

basta con sustituir GETDATE() con el campo de fecha de la tabla.

+2

¿Cómo responde esto exactamente la pregunta? – deutschZuid

-3
select ltrim('000045', '0') from dual; 

LTRIM 
----- 
45 

Esto debería hacer.

+2

No hay sobrecarga para el servidor SQL. – BillRob

3

que tenían la misma necesidad y utilizaron este:

select 
    case 
     when left(column,1) = '0' 
     then right(column, (len(column)-1)) 
     else column 
     end 
-3

me tomaron de las ideas anteriormente. Esto no es ni rápido ni elegante. pero es exacto

CASO

WHEN left(column, 3) = '000' THEN right(column, (len(column)-3)) 

WHEN left(column, 2) = '00' THEN right(a.column, (len(column)-2)) 

WHEN left(column, 1) = '0' THEN right(a.column, (len(column)-1)) 

ELSE 

FIN

+0

Es también no es dinámico para permitir más de 3 ceros. – JoeFletch

0

Puede utilizar esta:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0') 
-3
select CASE 
     WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0 
      THEN '' 
      ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18) 
     END 
+1

Debe dar una explicación con sus respuestas, no solo un fragmento de código. Además, formatee código como código (hay un botón en la parte superior del cuadro de entrada de texto). –

0

puede probar esta SELECT REPLACE(columnname,'0','') FROM table

+0

Esto eliminará 0 independientemente de su posición. La pregunta solo pregunta sobre los principales. – Sunil

+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (https://stackoverflow.com/help/whats-reputation) usted podrá [comentar cualquier publicación] (https://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la opinión] (/ reseña/mensajes de baja calidad/18471609) –

0

Puede probar esta - se necesita un cuidado especial a los ceros iniciales única de quitar si es necesario:

DECLARE @LeadingZeros VARCHAR(10) ='-000987000' 

SET @LeadingZeros = 
     CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1 THEN 
      @LeadingZeros 
     ELSE 
      CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
     END 

SELECT @LeadingZeros 

o simplemente puede llamar

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
Cuestiones relacionadas