Snowflake中排除以E或E1结尾的ORDER_ID数据
解决ORDER_ID结尾匹配排除问题
需要排除ORDER_ID列中以E或E1结尾的订单,但保留那些E出现在开头或中间的订单(例如SDIE40000094113788)。之前的代码使用'%E%'会匹配所有包含E的订单,导致误删正常数据,以下是修正后的方案:
通用LIKE写法(适配多数数据库)
SELECT ORDER_ID, CASE WHEN ORDER_ID LIKE '%E' OR ORDER_ID LIKE '%E1' THEN 1 ELSE 0 END AS Exchange FROM shop_orders_production op WHERE CAST(op.ORIGINAL_TIMESTAMP AS DATE) >= '2022-12-01' AND CAST(op.ORIGINAL_TIMESTAMP AS DATE) < '2023-01-01' AND NOT (ORDER_ID LIKE '%E' OR ORDER_ID LIKE '%E1');
说明
%E精准匹配以E结尾的订单号,%E1精准匹配以E1结尾的订单号- 使用
NOT逻辑排除上述两类订单,保留其他所有订单(包括开头、中间含E的订单) - 日期条件也可简化为
BETWEEN '2022-12-01' AND '2022-12-31',效果一致
正则表达式写法(部分数据库支持,如PostgreSQL、MySQL)
如果你的数据库支持正则表达式,可用更简洁的语法:
-- PostgreSQL示例 SELECT ORDER_ID, CASE WHEN ORDER_ID ~ 'E1?$' THEN 1 ELSE 0 END AS Exchange FROM shop_orders_production op WHERE CAST(op.ORIGINAL_TIMESTAMP AS DATE) >= '2022-12-01' AND CAST(op.ORIGINAL_TIMESTAMP AS DATE) < '2023-01-01' AND NOT (ORDER_ID ~ 'E1?$');
-- MySQL示例 SELECT ORDER_ID, CASE WHEN ORDER_ID REGEXP 'E1?$' THEN 1 ELSE 0 END AS Exchange FROM shop_orders_production op WHERE CAST(op.ORIGINAL_TIMESTAMP AS DATE) >= '2022-12-01' AND CAST(op.ORIGINAL_TIMESTAMP AS DATE) < '2023-01-01' AND NOT (ORDER_ID REGEXP 'E1?$');
说明
E1?$表示匹配以E(1出现0次)或E1(1出现1次)结尾的字符串- 正则写法更简洁,适合复杂匹配场景,但需注意不同数据库的正则语法差异
内容的提问来源于stack exchange,提问作者steph
相关产品推荐
相关产品推荐

