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 谓词不能高效...
祝你好运
理智的马可
是否可以 运行 查询匹配另一个 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 谓词不能高效...
祝你好运
理智的马可