Wie die Fehlermeldung sagt, Argumente für WHERE
darf keinen Satz zurückgeben. jsonb_array_elements
gibt eine Menge zurück und kann nicht mit einem einzelnen Wert verglichen werden. In der zweiten Abfrage haben Sie einen Cross Join innerhalb der Auswahl, der sie in ein geeignetes Ergebnis umwandelt, um WHERE
zu verwenden ein.
Sie können es auch so machen
SELECT mydata.pk FROM mydata
WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');
Hier erlaubt Ihnen die Unterauswahl, den IN
zu verwenden Operator, um den gewünschten Wert zu finden, da das Ergebnis keine Menge mehr ist.
Eine andere Möglichkeit besteht darin, die jsonb direkt abzufragen
SELECT mydata.pk FROM mydata
WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;
Auf diese Weise müssen Sie die jsonb nicht in eine Ergebnismenge konvertieren und darin suchen.