Ricerca di substring da una subquery in PostgreSQL

Ho un database POstgreSQL nel quale ho definito una tabella e voglio trovare una stringa in una riga, (tipo di dati 'character varying') ovvero una substring, all'interno della tabella usando la sottostringa (tipo di dati 'character varying') restituita dalla sottoquery (subquery):

SELECT  MyTable.myColumn
FROM  MyTable
WHERE myColumn LIKE (
    SELECT str
    FROM test
    WHERE str IS NOT NULL)

ma lanciando questa query select ottengo il seguente errore:

ERROR:  more than one row returned by a subquery used as an expression

Come posso trovare la substring (sottostringa) usando i risultati della subquery (sottoquery)?

In Corso 3
PostgreSQL 17-10-2019 3 Risposte 3185 Visite +3

Risposte ( 3 approvate )

  1. Caterina Stoletti
    +2
    17-10-2019 18:25:01
    Rispondi

    Usa like any come operatore anzichè like, in questo modo:

    SELECT  MyTable.myColumn
    FROM  MyTable
    WHERE myColumn LIKE ANY(
       SELECT str
       FROM test
    WHERE str IS NOT NULL)

    o prova anche così:

    SELECT  MyTable.myColumn
    FROM  MyTable
    WHERE myColumn LIKE ANY(
       SELECT '%' || str || '%'
       FROM test
    WHERE str IS NOT NULL)

    sfruttando il wildcard % (stringa composta da zero o più caratteri) con l'operatore logico or ||. Spero possa esserti d'aiuto.

  2. Emanuele Segatti
    +1
    17-10-2019 18:30:39
    Rispondi

    Prendendo spunto dall'esempio postato da Caterina Stoletti, per trovare la substring da una riga ritornata da una subquery ti suggeriso anche io di fare in questo modo:

    SELECT string_a 
    FROM table_A 
    WHERE string_a LIKE ANY (SELECT '%'|| str ||'%' FROM table_B);
  3. Andrea Rimpezzi
    0
    17-10-2019 18:36:15
    Rispondi

    Sembrerebbe molto probabile che ci sia più di una str nel test in cui str NON È NULL. Ecco perché viene restituita più di una riga dalla sottoquery utilizzata come espressione ecco perché PostgreSQL restituisce esito negativo da quella istruzione.

    Esegui la subquery autonoma (come se fosse una query singola di primo livello) per vedere cosa ritorna. Forse intendevi che fosse una sottoquery correlata ma hai dimenticato il riferimento alla colonna esterna? O forse c'è una colonna chiamata anche str nella tabella esterna e intendevi scrivere:

    SELECT  MyTable.myColumn
    FROM  MyTable
    WHERE myColumn LIKE (
    SELECT test.str
    FROM test
    WHERE MyTable.str IS NOT NULL)

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

Vito Natello

Vito Natello

Autore di questa domanda

 Domanda Precedente

 Elenco Domande 

Domanda Successiva