sql >> Base de Datos >  >> RDS >> PostgreSQL

Encuentra filas donde la matriz de texto contiene un valor similar a la entrada

También es importante comprender que ANY es no un operador pero una construcción SQL que solo se puede usar a la derecha de un operador. Más:

  • ¿Cómo usar ANY en lugar de IN en una cláusula WHERE con Rails?

El LIKE operador - o más precisamente:expresión , que se reescribe con ~~ operador en Postgres internamente - espera el valor a la izquierda y el patrón A la derecha. No hay COMMUTATOR para este operador (como lo hay para el operador de igualdad simple = ) para que Postgres no pueda cambiar los operandos.

Tu intento:

select * from someTable where '%someInput%' LIKE ANY(someColum);

ha volteado el operando izquierdo y derecho, por lo que '%someInput%' es el valor y elementos de la columna de matriz someColum se toman como patrones (que no es lo que quieres).

sería tiene que ser ANY(someColum) LIKE '%someInput%' - excepto que eso no es posible con ANY construcción que solo está permitida a la derecha de un operador. Estás golpeando un obstáculo aquí.

Relacionado:

  • ¿Hay alguna forma de indexar de manera útil una columna de texto que contenga patrones de expresiones regulares?
  • ¿Puede PostgreSQL indexar columnas de matrices?

Puede normalizar su diseño relacional y guardar elementos de la matriz en filas separadas en una tabla separada. Salvo eso, unnest() es la solución, como ya te has encontrado. Pero si bien solo está interesado en la existencia de al menos un elemento coincidente, un EXISTS la subconsulta será más eficiente y evitará duplicados en el resultado:Postgres puede detener la búsqueda tan pronto como se encuentre la primera coincidencia:

SELECT *
FROM   tbl
WHERE  EXISTS (
    SELECT -- can be empty 
    FROM   unnest(someColum) elem
    WHERE  elem LIKE '%someInput%'
  );

Es posible que desee escapar del carácter especial en someInput . Ver:

  • Función de escape para expresiones regulares o patrones LIKE

Cuidado con la negación (NOT LIKE ALL (...) ) cuando NULL puede estar involucrado:

  • Comprobar si NULL existe en la matriz de Postgres