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

如何筛选包含Lookup表促销码的Main表数据并创建视图?

问题解决:筛选包含指定促销码的行

问题背景

现有两张表:

  • Main表:Promotion Codes List字段为逗号分隔的促销码字符串
  • Lookup表:Promotion Codes字段为单个促销码

需要创建Main表的视图,仅保留Promotion Codes List中包含Lookup表任意促销码的行。


示例数据

Main表样本数据

|id|Promotion Codes List|
|--| ------------------ |
|1 | BR-Coll-210731-10903, BR-NFRD-210731-10124 |
|2 | BR-Coll-210731-10903, BR-Deal-210731-11265 |
|3 | BR-Coll-210731-11037, BR-Deal-210731-11275 |
|4 | BR-Coll-210731-11037 |

Lookup表样本数据

|id|Promotion Codes|
|--| ------------- |
|1 | BR-NFRI-251231-04855 |
|2 | BR-Deal-210731-11265 |
|3 | BR-Coll-210731-11402 |
|4 | BR-Deal-210731-11275 |
|5 | BR-Coll-210731-11037 |

期望输出视图数据

|id|Promotion Codes List|
|--| ------------------ |
|2 | BR-Coll-210731-10903, BR-Deal-210731-11265 |
|3 | BR-Coll-210731-11037, BR-Deal-210731-11275 |
|4 | BR-Coll-210731-11037 |

现有问题

尝试的SQL仅能匹配完全一致的单行促销码,无法处理多促销码的情况:

SELECT        [Promotion Codes List], 
              CASE WHEN EXISTS (
                  SELECT *
                  FROM dbo.[Lookup] B
                  WHERE B.[Promotion Codes] = A.[Promotion Codes List]
              ) THEN 'common' ELSE 'not common' END AS valid 
FROM dbo.Main AS A

解决方案

提供两种可行的SQL写法:

方法1:通用模糊匹配(兼容多数数据库)

通过给字符串前后添加逗号,确保匹配完整的促销码,同时处理空格问题:

SELECT A.id, A.[Promotion Codes List]
FROM dbo.Main AS A
WHERE EXISTS (
    SELECT 1
    FROM dbo.[Lookup] B
    WHERE ',' + REPLACE(A.[Promotion Codes List], ' ', '') + ',' 
          LIKE '%,' + REPLACE(B.[Promotion Codes], ' ', '') + ',%'
)

方法2:字符串拆分精确匹配(SQL Server 2016+)

利用STRING_SPLIT拆分逗号分隔的字符串,再与Lookup表精确匹配,最后去重:

SELECT DISTINCT A.id, A.[Promotion Codes List]
FROM dbo.Main AS A
CROSS APPLY STRING_SPLIT(A.[Promotion Codes List], ',') AS SplitCodes
JOIN dbo.[Lookup] B 
    ON LTRIM(RTRIM(SplitCodes.value)) = B.[Promotion Codes]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:50