2017-08-17 1 views
0

J'ai besoin de tester si une partie d'une valeur de colonne est dans une chaîne donnée, au lieu de savoir si la chaîne fait partie d'une valeur de colonne. Par exemple:PostgreSQL Reverse LIKE

De cette façon, je peux trouver si l'une des lignes de ma table contient la chaîne « briques » dans column:

SELECT column FROM table 
WHERE column ILIKE '%bricks%'; 

Mais ce que je cherche, est de savoir si une partie de la phrase "Les navires suspendus dans le ciel de la même manière que les briques ne" est dans l'une des lignes. Quelque chose comme:

SELECT column FROM table 
WHERE 'The ships hung in the sky in much the same way that bricks don’t' ILIKE '%' || column || '%'; 

Ainsi, la ligne du premier exemple, où la colonne contient « briques », sera affiché comme résultat.

J'ai examiné quelques suggestions ici et d'autres forums, mais aucun d'eux n'a fonctionné.

+0

Semble bien à moi, [ici] (http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=6889c69d6d61fb8424c53e25206bb60a) est une démo – Lamak

+0

@Lamak I t hink ils veulent diviser la phrase en mots séparés et vérifier pour voir si l'un de ces mots, dans n'importe quel ordre, est dans la colonne du tableau.Je pense que nous aurions besoin de diviser la chaîne en lignes, puis simplement vérifier si chacun existe – xQbert

+0

@xQbert ah, vous pourriez avoir raison. – Lamak

Répondre

3

Votre simples cas peut être résolu avec une requête simple utilisant la construction ANY et ~*:

SELECT * 
FROM tbl 
WHERE col ~* ANY (string_to_array('The ships hung in the sky ... bricks don’t', ' ')); 

~* est le cas insensible opérateur régulier de correspondance d'expression. J'utilise cela au lieu de ILIKE afin que nous puissions nous débrouiller avec les mots d'origine dans votre chaîne et ne pas avoir besoin de pad % pour ILIKE. Le résultat est le même - à l'exception des mots contenant des caractères spéciaux: %_\ pour ILIKE et !$()*+.:<=>?[\]^{|}- pour les modèles d'expression régulière. Vous devrez peut-être échapper aux caractères spéciaux de toute façon pour éviter les surprises. Voici une fonction pour les expressions régulières:

Mais je doute lancinante qui sera tout ce que vous avez besoin. Voir mon commentaire Je suppose que vous avez besoin Recherche plein texte avec un dictionnaire correspondant à votre langue naturelle pour fournir mot utile ... issu

connexes:

1

Cette requête:

SELECT 
regexp_split_to_table(
    'The ships hung in the sky in much the same way that bricks don’t', 
    '\s'); 

donne un résultat suivant:

| regexp_split_to_table | 
|-----------------------| 
|     The | 
|     ships | 
|     hung | 
|     in | 
|     the | 
|     sky | 
|     in | 
|     much | 
|     the | 
|     same | 
|     way | 
|     that | 
|    bricks | 
|     don’t | 

Maintenant, il suffit de faire un semi-jointure contre un résultat de cette requête pour obtenir les résultats souhaités

SELECT * FROM table t 
WHERE EXISTS (
    SELECT * FROM (
     SELECT 
    regexp_split_to_table(
     'The ships hung in the sky in much the same way that bricks don’t', 
     '\s') x 
    ) x 
    WHERE t.column LIKE '%'|| x.x || '%' 
)