He estado usando esto por algún tiempo:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
Sin embargo, recientemente encontré un problema con las columnas con todos los caracteres "0" como '00000000' porque nunca encuentra un carácter que no sea "0" para que coincida.
Una técnica alternativa que he visto es usar TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Esto tiene un problema si hay espacios incrustados, porque se convertirán en "0" cuando los espacios se vuelvan a convertir en "0".
Estoy tratando de evitar un UDF escalar. He encontrado muchos problemas de rendimiento con UDF en SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
fuente
fuente
Respuestas:
fuente
Arvo
en SO!¿Por qué no echas el valor
INTEGER
y luego vuelves aVARCHAR
?fuente
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
algunos tipos de cadena fallarán esta conversión. Considere0001E123
por ejemplo.Otras respuestas aquí para no tener en cuenta si tiene todo cero (o incluso un solo cero).
Algunos siempre predeterminan una cadena vacía a cero, lo cual es incorrecto cuando se supone que debe permanecer en blanco.
Vuelva a leer la pregunta original. Esto responde a lo que quiere el interrogador.
Solución # 1:
Solución # 2 (con datos de muestra):
Resultados:
Resumen:
Podrías usar lo que tengo arriba para una eliminación única de los ceros a la izquierda.
Si planea reutilizarlo mucho, colóquelo en una función de valor de tabla en línea (ITVF).
Sus preocupaciones sobre problemas de rendimiento con UDF son comprensibles.
Sin embargo, este problema solo se aplica a todas las funciones escalares y a las funciones de tabla de varias instrucciones.
Usar ITVF está perfectamente bien.
Tengo el mismo problema con nuestra base de datos de terceros.
¡Con los campos alfanuméricos se ingresan muchos sin los espacios iniciales, malditos humanos!
Esto hace que las uniones sean imposibles sin limpiar los ceros iniciales que faltan.
Conclusión:
En lugar de eliminar los ceros a la izquierda, puede considerar simplemente rellenar sus valores recortados con ceros a la izquierda cuando haga sus uniones.
Mejor aún, limpie sus datos en la tabla agregando ceros a la izquierda y luego reconstruyendo sus índices.
Creo que esto sería MUCHO más rápido y menos complejo.
fuente
En lugar de un espacio, reemplace los 0 con un carácter de espacio en blanco 'raro' que normalmente no debería estar en el texto de la columna. Un avance de línea es probablemente lo suficientemente bueno para una columna como esta. Entonces puede LTrim normalmente y reemplazar el carácter especial con 0 nuevamente.
fuente
Lo siguiente devolverá '0' si la cadena consiste completamente en ceros:
fuente
Esto hace una buena función ...
fuente
cast (value as int) siempre funcionará si string es un número
fuente
Mi versión de esto es una adaptación del trabajo de Arvo, con un poco más para asegurar otros dos casos.
1) Si tenemos todos los 0, deberíamos devolver el dígito 0.
2) Si tenemos un espacio en blanco, aún deberíamos devolver un carácter en blanco.
fuente
La sugerencia de Thomas G funcionó para nuestras necesidades.
El campo en nuestro caso ya era una cadena y solo los ceros iniciales necesitaban ser recortados. Principalmente es todo numérico, pero a veces hay letras, por lo que la conversión INT anterior se bloqueará.
fuente
Esto tiene un límite en la longitud de la cadena que se puede convertir a un INT
fuente
Si está utilizando Snowflake SQL, puede usar esto:
La función ltrim elimina todas las instancias del conjunto designado de caracteres del lado izquierdo.
Entonces ltrim (str_col, '0') en '00000008A' devolvería '8A'
Y rtrim (str_col, '0.') En '$ 125.00' devolvería '$ 125'
fuente
Funciona bien incluso con '0', '00' y así sucesivamente.
fuente
Prueba esto:
fuente
Si no desea convertir a int, prefiero esta lógica a continuación porque puede manejar nulos IFNULL (campo, LTRIM (campo, '0'))
fuente
En MySQL puedes hacer esto ...
fuente