DuckDB技术问题:如何用WHERE子句判断VARCHAR是否在LIST中
解决DuckDB中判断VARCHAR是否在LIST的WHERE条件错误
你有一个LIST类型的变量dois,值为:
["10.3390/polym11050769", "10.1016/j.ijbiomac.2022.09.237"]
还有一个VARCHAR类型的字段article_doi,值为"10.3390/polym11050769"。尝试用以下语句判断article_doi是否在dois中时触发错误:
WHERE CAST(article_doi AS VARCHAR) IN (dois)
错误信息:
duckdb error: Conversion Error: Type VARCHAR with value '10.1016/j.jeurceramsoc.2004.01.003' can't be cast to the destination type LIST
错误原因
IN运算符要求右侧是离散值集合或子查询结果,直接传入LIST类型变量时,DuckDB会错误地尝试将左侧的VARCHAR值转换为LIST类型,导致转换失败。
正确实现方法
方法1:使用LIST_CONTAINS函数(推荐)
DuckDB提供了专门的LIST_CONTAINS函数,用于判断元素是否存在于LIST中,语法简单高效:
WHERE LIST_CONTAINS(dois, article_doi)
方法2:用UNNEST展开LIST后使用IN
如果坚持使用IN,可以通过UNNEST将LIST展开为单行数据集,再进行匹配:
WHERE article_doi IN (SELECT UNNEST(dois))
这两种方法都能正确判断article_doi是否在dois列表中,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Milos Cuculovic
相关产品推荐
相关产品推荐

