Vertica - 用作表达式的子查询返回多行

Vertica - Subquery used as an expression returned more than one row

是否可以 运行 查询匹配另一个 table 列中的任何行?例如,我正在尝试 运行 这个:

SELECT *
FROM emails
WHERE address ILIKE '%@' || IN (select * from dictionary.wordlist) || '.%'

但是这个 returns [Vertica]VJDBC 错误:用作表达式的子查询返回多于一行

这是一种奇怪的表述方式...

如果你回到基础 SQL 教程,你会明白像 '%@' 这样的字符串文字,可以作为 ILIKE 谓词的操作数,不能与 IN ( ) 子句 - 它本身就是一个谓词。

我假设您要查找 emails table 中的所有行,其地址包含 dictionary.wordlist 中符号和点之间的任何单词。

我希望(如果我错了请纠正我)dictionary.wordlist 是一个 table,其中一列为 VARCHAR() 或其他字符串格式。如果是这样的话,你可以这样做:

WITH
-- out of "dictionary.wordlist", create an in-line-table containing a column
-- with the wildcard operand to be later used in an ILIKE predicate
operands(operand) AS (
  SELECT
    '%@'||wordlist.word||'.%'
  FROM dictionary.wordlist
)
SELECT
  emails.*
FROM emails
INNER JOIN operands
ON email.address ILIKE operands.operand
;

当然还有其他方法,但这只是其中之一。 我并不是说它会非常快 - 作为 JOIN 条件的 ILIKE 谓词不能高效...

祝你好运

理智的马可