如何编写SQL查询语句筛选无重复数据库(保留eur后缀实例)
解决方案:筛选无重复的有效数据库实例
没问题,这个需求咱们可以通过字符串处理+分组筛选来实现,我给你写个通用的SQL方案,适配大部分主流数据库:
首先先明确规则:对于每个数据库的「基础名称」(比如ceur去掉eur后缀后是c,c的基础名称就是它自己),如果存在带eur后缀的实例,就保留这个带后缀的;如果只有原名称实例,就保留原名称。
完整SQL代码
-- 第一步:模拟你的原始数据库实例列表,实际使用时替换成你的表和字段 WITH db_instances AS ( SELECT 'a' AS db_name UNION ALL SELECT 'b' UNION ALL SELECT 'c' UNION ALL SELECT 'ceur' UNION ALL SELECT 'd' UNION ALL SELECT 'f' UNION ALL SELECT 'feur' UNION ALL SELECT 'g' UNION ALL SELECT 'geur' ), -- 第二步:给每个实例生成基础名称和eur标记 db_with_metadata AS ( SELECT db_name, -- 提取基础名称:如果以eur结尾,就去掉最后3个字符,否则用原名称 CASE WHEN RIGHT(db_name, 3) = 'eur' THEN LEFT(db_name, LENGTH(db_name) - 3) ELSE db_name END AS base_name, -- 标记是否为eur后缀实例(1是,0否) CASE WHEN RIGHT(db_name, 3) = 'eur' THEN 1 ELSE 0 END AS is_eur_instance FROM db_instances ) -- 第三步:筛选每个基础名称下的有效实例 SELECT db_name FROM db_with_metadata WHERE (base_name, is_eur_instance) IN ( -- 对每个基础名称,优先选择eur后缀的实例(is_eur_instance值更大) SELECT base_name, MAX(is_eur_instance) FROM db_with_metadata GROUP BY base_name );
代码解释
db_instancesCTE:只是模拟你提供的原始数据,实际使用时直接替换成你的业务表(比如SELECT your_db_column FROM your_table)即可。db_with_metadataCTE:base_name:统一每个实例的基础标识,把ceur、c归为同一个基础名称c,方便后续分组判断。is_eur_instance:用1/0标记是否是带eur后缀的实例,方便后续优先选择。
- 最终筛选:对每个
base_name,我们只保留is_eur_instance最大的那条记录——这样当同时存在原名称和eur后缀实例时,会自动选中eur的;如果只有原名称,就保留它自己。
不同数据库的适配调整
如果你的数据库是Oracle,需要调整字符串函数:
RIGHT(db_name, 3)→SUBSTR(db_name, -3)LEFT(db_name, LENGTH(db_name)-3)→SUBSTR(db_name, 1, LENGTH(db_name)-3)
执行这个SQL后,就能得到你期望的结果:a b ceur d feur geur。
内容的提问来源于stack exchange,提问作者Artiom Gridenka
相关产品推荐
相关产品推荐

