如何修改SQL查询以匹配多种格式的地点数据?
问题分析
你的原SQL只替换了字符串中第一处括号及内部内容,而第一种格式包含两处括号((US)和(NY)),处理后会得到United States ;New York ,自然无法匹配目标值United States;New York。
解决方法
方法1:正则全局替换(推荐,支持正则的SQL环境)
用正则匹配所有(...)格式的内容并全局替换,再清理空格:
SELECT * FROM TaxonomyLocations_Archive WHERE TRIM( REPLACE( -- 全局替换所有(...)内容(包括括号) REGEXP_REPLACE(TaxonomyHierarchy, '\([^)]*\)', '', 'g'), ' ;', ';' ) ) = 'United States;New York'
\([^)]*\):精准匹配任意以(开头、)结尾的片段'g':表示全局替换所有匹配项,而非仅第一个TRIM:处理字符串首尾可能残留的空格
方法2:嵌套替换(兼容无正则支持的老版本SQL)
如果你的SQL环境不支持正则,可以通过多次嵌套REPLACE处理多组括号:
SELECT * FROM TaxonomyLocations_Archive WHERE TRIM( REPLACE( -- 第一次替换第一处括号内容 REPLACE( TaxonomyHierarchy, SUBSTRING(TaxonomyHierarchy, CHARINDEX('(', TaxonomyHierarchy), CHARINDEX(')', TaxonomyHierarchy) - CHARINDEX('(', TaxonomyHierarchy) + 1), '' ), -- 第二次替换剩余的括号内容(如果存在) CASE WHEN CHARINDEX('(', TaxonomyHierarchy) > 0 THEN SUBSTRING(TaxonomyHierarchy, CHARINDEX('(', TaxonomyHierarchy), CHARINDEX(')', TaxonomyHierarchy) - CHARINDEX('(', TaxonomyHierarchy) + 1) ELSE '' END, '' ), ' ;', ';' ) = 'United States;New York'
注:如果数据中存在超过2组括号,需要继续嵌套REPLACE,灵活性不如正则方案。
内容的提问来源于stack exchange,提问作者RealSteel
相关产品推荐
相关产品推荐

