【问题标题】:How can I get return value for partially matching another columns in SQL?如何获取部分匹配 SQL 中其他列的返回值?
【发布时间】:2021-03-29 14:43:12
【问题描述】:

在 plsql 中进行以下查询:

Select b.geo, b.country,a.country 
From table_a a
Left join table_b b 
On LTRIM(RTRIM(UPPER(b.country))) = LTRIM(RTRIM(UPPER(a.country)))

假设上面的查询返回输出为

  1. 拉丁美洲哥伦比亚哥伦比亚
  2. null null Colombia_group1

我需要 Colombia_group1 它应该返回 LATAM

【问题讨论】:

  • 那看起来不像 PL/SQL 代码(PL/SQL 是 Oracle 过程语言);它看起来像 SQL 代码。
  • 提供样本数据和期望的输出,否则我们无法理解发生了什么
  • 所以在表 A 中,在 COUNTRY 列中,值有时是 Columbia_group1?那是什么国家?为什么首先允许在您的表中使用这些值?并且,如果这些值是可能的,那么它们在表 B 中也可能是可能的。如果表 A 中有 Brazil_group1,表 B 中有 Brazil_nogroup,你会怎么做?你还希望他们匹配吗?如果拼写有差异怎么办——一张表是意大利,另一张是意大利?等等。

标签: sql oracle sql-like


【解决方案1】:

你可以使用LIKE:

Select b.geo, b.country,a.country 
From   table_a a
       LEFT OUTER JOIN table_b b 
       ON TRIM(UPPER(a.country)) LIKE TRIM(UPPER(b.country)) || '%'

其中,对于样本数据:

CREATE TABLE table_a ( country ) AS
SELECT 'Colombia' FROM DUAL UNION ALL
SELECT 'Colombia_group1' FROM DUAL;

CREATE TABLE table_b ( country, geo ) AS
SELECT 'Colombia', 'LATAM' FROM DUAL;

输出:

地球仪 |国家 |国家 :---- | :------- | :-------------- 拉丁美洲 |哥伦比亚 |哥伦比亚 拉丁美洲 |哥伦比亚 |哥伦比亚_group1

db小提琴here

【讨论】:

    【解决方案2】:

    你可以使用LIKE:

    Select b.geo, b.country,a.country 
    From table_a a Left join
         table_b b 
         On TRIM(UPPER(b.country)) like TRIM(UPPER(a.country)) || '%';
    

    注意,Oracle 有一个TRIM() 函数,所以不需要下一个LTRIM()/RTRIM()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2010-09-18
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多