¿Cómo puedo obtener la posición de un valor en matrices PostgreSQL? Hay un método .index()
para Python y array_search()
función para PHP, pero no puedo encontrar ninguna función para PostgreSQL. ¿Debo escribir una función almacenada para hacer eso? Prefiero resolver usando una función incorporada.Encontrar la posición de un valor en matrices PostgreSQL
Respuesta
Since version 9.5, hay funciones integradas: array_position()
y array_positions()
, para buscar la clave de matriz (solo la primera aparición) o las claves (todas las apariciones), por valor.
Estas funciones son compatibles con el tipo anyarray.
El documentation recommends utilizando la función generate_subscripts
. La función de emular a continuación PHP de array_search
:
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
SELECT i
FROM generate_subscripts($2, 1) AS i
WHERE $2[i] = $1
ORDER BY i
$$ LANGUAGE sql STABLE;
Esto devuelve el índice del primer partido, si está presente. Si desea todas las coincidencias, simplemente cambie RETURNS INT
a RETURNS SETOF INT
. Esta función, como está, devuelve NULL
si no se encuentra ninguna coincidencia.
Esta función solo funciona con matrices unidimensionales.
Además, tener en cuenta que array_search(NULL, a)
siempre devuelve NULL
, incluso si la matriz contiene elementos nulos:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
Esto se debe a SQL considera NULL = NULL
ser desconocido (es decir NULL
). Ver functions-comparison. Si quieres array_search
a ser capaz de encontrar NULL
elementos, cambiar
WHERE $2[i] = $1
a
WHERE $2[i] IS NOT DISTINCT FROM $1
Para matrices de enteros solamente se puede utilizar en gran medida el más rápido idx
function from the intarray
bundled extension.
Esta función no se ha generalizado para admitir todos los tipos de matriz, lamentablemente, por lo que está atascado con un enfoque SQL muy lento para otras matrices.
- 1. ¿Encontrar la posición de un elemento en una matriz bidimensional?
- 2. Encontrar el valor hash de una fila en postgresql
- 3. matrices Java y PostgreSQL
- 4. Encontrar el número de 1s en la misma posición en dos matrices
- 5. Encontrar la posición del cursor en un cuadro de texto
- 6. Encontrar la posición de un elemento en una matriz sencilla
- 7. ¿Cómo encontrar la posición de intercalación en un NSTextView?
- 8. Encontrar la posición del elemento máximo
- 9. Encontrar rangos contiguos en matrices
- 10. Cómo encontrar la posición del cursor en un JTextArea
- 11. Actualizar el valor de la columna PostgreSQL
- 12. ¿Cómo encontrar la opción de seleccionar posición?
- 13. Encontrar la posición del texto del cursor en JTextField
- 14. ¿Cómo encontrar valores duplicados en matrices?
- 15. ¿Cómo presiono un valor en un hash Perl de matrices?
- 16. encontrar la posición de una subcadena en una cadena
- 17. ¿Cómo encontrar la posición de traducción actual en Canvas?
- 18. Postgresql: insertar valor de una columna desde un archivo
- 19. ¿Cómo cambio el valor predeterminado de la columna en PostgreSQL?
- 20. Insertar valor nulo en un campo inet en postgresql
- 21. Encontrar valor en unordered_map
- 22. Encontrar el valor mínimo en un mapa
- 23. Encontrar la posición de la diferencia entre dos cadenas
- 24. ¿Cómo encontrar la posición del cursor en una DIV contenteditable?
- 25. Encontrar un valor en la lista de {clave, valor} en Erlang
- 26. Valor de retorno de la función anónima postgresql
- 27. ¿Cómo encontrar la posición global del cursor de texto?
- 28. ¿Cómo encontrar la posición de un elemento en una lista, en Python?
- 29. ¿Cómo puedo encontrar la posición de una ventana maximizada?
- 30. Encontrar el valor máximo en la columna de la tabla
+1 para generate_subscripts() y una respuesta muy completa. –
Buena respuesta. Esto se volverá más simple y más eficiente cuando PostgreSQL 9.4 agregue funciones 'WITH ORDINAL', lo que le permite escribir' unnest (the_array) WITH ORDINAL'. Quizás debería escribir y enviar una función apropiada de 'idx' para 9.4, aunque ... –