Tengo una mesa customers
con la estructura como:
id: int
products: text[]
Me gustaría crear una consulta SQL que verifique si hay un producto con un nombre que contenga la frase "a" pero que no contenga la frase "b", así que básicamente: product ILIKE "%a%" AND product NOT ILIKE "%b%"
Si quiero verificar la existencia del elemento, entonces es tan simple como usar el @>
operador, pero aquí probé con UNNEST
muchos enfoques diferentes y nada parece funcionar.
Solo quiero incluir una fila de cliente determinada o no dependiendo de esta condición. Puedes ayudar con eso?
Probé cosas como:
SELECT
*
FROM
customers,
UNNEST(products) AS product
WHERE
product ILIKE '%a%' AND product NOT ILIKE '%b%';
o
SELECT
*
FROM
customers
LEFT JOIN LATERAL (
SELECT * FROM UNNEST(products) AS element
) AS products2 ON TRUE
WHERE
element ILIKE '%a%' AND element NOT ILIKE '%b%';
En teoría, podría hacer algo como:
products::TEXT ILIKE '%a%' AND products::TEXT NOT ILIKE '%b%'
Pero ese es un truco feo que no siempre funcionará
Yo recomendaria:
select c.*
from customers c
where exists (select 1
from unnest(c.products) p
where p like '%a%'
) and
not exists (select 1
from unnest(c.products) p
where p like '%b%'
);
Usted puede hacer esto con un solo UNNEST. Simplemente parece más complicado:
select c.*
from customers c
where (select countif(p like '%a%') = count(*) and
countif(p like '%b%') = 0
from unnest(c.products) p
where p like '%a%' or p like '%b%'
) ;
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras