You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用regexp检测表中文本?解决标量子查询多元素错误

解决SQL子查询返回多行的报错问题

错误原因

你的子查询SELECT shop_domain FROM data返回了多条店铺域名记录,但regexp_contains函数的第二个参数只能接受单个字符串,因此触发了“Scalar subquery produced more than one element”错误。

可行解决方案

方案一:使用EXISTS子查询(推荐,性能更优)

通过EXISTS直接判断当前流量的入口页面是否匹配任意一条已注册店铺域名,逻辑清晰且避免多值问题:

SELECT 
  entrance_page_name,
  Visitor,
  CASE 
    WHEN EXISTS (
      SELECT 1 
      FROM `data` d
      WHERE regexp_contains(t1.entrance_page_name, d.shop_domain)
    ) THEN TRUE 
    ELSE FALSE 
  END AS is_registered_shop
FROM 表1 t1

方案二:聚合域名生成正则匹配模式

如果你的SQL引擎支持字符串聚合(比如BigQuery、PostgreSQL),可以将所有已注册域名合并成一个用|分隔的正则表达式,一次性匹配所有域名:

WITH domain_list AS (
  -- 聚合所有域名,若域名包含正则特殊字符(如.、*)需先转义
  SELECT STRING_AGG(REGEXP_REPLACE(shop_domain, r'([\.\\\*\+\?\|\(\)\[\]\{\}\^$])', r'\\\1'), '|') AS domain_pattern
  FROM `data`
)
SELECT 
  entrance_page_name,
  Visitor,
  CASE 
    WHEN regexp_contains(t1.entrance_page_name, dl.domain_pattern) THEN TRUE 
    ELSE FALSE 
  END AS is_registered_shop
FROM 表1 t1
CROSS JOIN domain_list dl

方案三:LEFT JOIN结合分组判断

通过左连接关联两张表,再分组判断是否存在匹配的注册店铺:

SELECT 
  t1.entrance_page_name,
  t1.Visitor,
  MAX(CASE WHEN d.shop_id IS NOT NULL THEN TRUE ELSE FALSE END) AS is_registered_shop
FROM 表1 t1
LEFT JOIN `data` d ON regexp_contains(t1.entrance_page_name, d.shop_domain)
GROUP BY t1.entrance_page_name, t1.Visitor

内容的提问来源于stack exchange,提问作者rien312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:55:29