En PostgreSQL tengo una tabla con una columna varchar. Se supone que los datos son enteros y los necesito en tipo entero en una consulta. Algunos valores son cadenas vacías. El seguimiento:
SELECT myfield::integer FROM mytable
rendimientos ERROR: invalid input syntax for integer: ""
¿Cómo puedo consultar un elenco y tener 0 en caso de error durante el elenco en postgres?
sql
postgresql
casting
silviot
fuente
fuente
E'\\d{1,5}$'
.{1,5}
límite de @ Bobort arriba en los dígitos es posiblemente una buena idea si le preocupa el desbordamiento, pero enmascarará números más grandes, lo que podría causar problemas si está convirtiendo una tabla. Personalmente, prefiero tener el error de consulta por adelantado y saber que algunos de mis "enteros" están atornillados (también puede seleccionar conE'\\d{6,}$'
primero para asegurarse).También puede crear su propia función de conversión, dentro de la cual puede usar bloques de excepción:
Pruebas:
fuente
INSERT
declaración?Tenía el mismo tipo de necesidad y encontré que esto funcionaba bien para mí (postgres 8.4):
Algunos casos de prueba para demostrar:
Si necesita manejar la posibilidad de que el campo tenga texto no numérico (como "100bad"), puede usar regexp_replace para quitar caracteres no numéricos antes de la conversión.
Luego, los valores de texto / varchar como "b3ad5" también darán números
Para abordar la preocupación de Chris Cogdon con la solución de no dar 0 para todos los casos, incluido un caso como "incorrecto" (sin caracteres de dígitos), hice esta declaración ajustada:
Funciona de manera similar a las soluciones más simples, excepto que dará 0 cuando el valor a convertir sea solo caracteres que no sean dígitos, como "incorrecto":
fuente
Esto podría ser algo así como un truco, pero hizo el trabajo en nuestro caso:
Explicación (Probado en Postgres 8.4):
La expresión mencionada anteriormente produce
NULL
valores NULL enmyfield
y0
para cadenas vacías (este comportamiento exacto puede o no ajustarse a su caso de uso).Datos de prueba:
La consulta arrojará el siguiente resultado:
Mientras que select solo
values::integer
dará como resultado un mensaje de error.Espero que esto ayude.
fuente
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Nunca he trabajado con PostgreSQL pero revisé el manual para ver la sintaxis correcta de las declaraciones IF en las consultas SELECT.
fuente
La respuesta de @ Matthew es buena. Pero puede ser más simple y más rápido. Y la pregunta pide convertir cadenas vacías (
''
) a0
, pero no a otra "sintaxis de entrada no válida" o entrada "fuera de rango":Esto devuelve
0
para una cadena vacía yNULL
para cualquier otra entrada no válida.Se puede adaptar fácilmente para cualquier conversión de tipo de datos .
Entrar en un bloque de excepción es sustancialmente más costoso. Si las cadenas vacías son comunes , tiene sentido detectar ese caso antes de generar una excepción.
Si las cadenas vacías son muy raras, vale la pena mover la prueba a la cláusula de excepción.
fuente
Esta función siempre regresará
0
si no hay dígitos en la cadena de entrada.SELECT parse_int('test12_3test');
volverá
123
fuente
Encontré el siguiente código fácil y funcional. La respuesta original está aquí https://www.postgresql.org/message-id/[email protected]
Espero eso ayude
fuente
SUBSTRING puede ayudar en algunos casos, puede limitar el tamaño de la int.
fuente
Si se supone que los datos son enteros, y solo necesita esos valores como enteros, ¿por qué no hace todo lo posible y convierte la columna en una columna entera?
Entonces podría hacer esta conversión de valores ilegales a ceros solo una vez, en el punto del sistema donde los datos se insertan en la tabla.
Con la conversión anterior, está obligando a Postgres a convertir esos valores una y otra vez para cada fila individual en cada consulta para esa tabla; esto puede degradar seriamente el rendimiento si realiza muchas consultas en esta columna de esta tabla.
fuente
La siguiente función hace
error_result
) para resultados no convertibles, p. ej.abc
o999999999999999999999999999999999999999999
null
comonull
bigints
se comparanlower_bound
para, por ejemplo, imponer valores positivos únicamentefuente
También tengo la misma necesidad, pero eso funciona con JPA 2.0 e Hibernate 5.0.2:
Funciona de maravillas. Creo que también funciona con LIKE.
fuente
Esto también debería hacer el trabajo, pero esto es a través de SQL y no específico de postgres.
fuente