Problem polega na tym, że wynik twojego podzapytania jest interpretowany jako ciąg, a nie tablica. Dzieje się tak, ponieważ te dwie formy są semantycznie różne:
~~ ANY ('...') -- will be interpreted as an array literal
i
~~ ANY (SELECT ...) -- will compare with all query results in turn
Możesz więc po prostu napisać:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')