基于前几个字符的情况

时间:2017-10-02 16:29:39

标签: sql join case teradata

我的表A看起来像这样:

Name   Phone
John   1111231234
Joe    1111231235
Jack   2221231234
Jenny  2224321234
Jody   3323214211

和表B看起来像这样:

AreaCode
111         
111
222
222

如何返回看起来像这样的结果?我基本上想要返回AreaCode,如果列中的前3个数字/字符'电话'存在于' AreaCode'列中。在表B中......

Name   Phone       AreaCode
John   1111231234  111
Joe    1111231235  111
Jack   2221231234  222
Jenny  2224321234  222
Jody   3323214211  null

4 个答案:

答案 0 :(得分:1)

使用左连接到表b,使用areacode连接手机的起始位置:

select
    name,
    phone,
    areacode
from tableA
left join tableB on phone like concat(areacode, '%')

答案 1 :(得分:0)

我使用distinct来避免重复的areacodes会给你带来重复的结果。 如果您将手机的电话号码存储为数字,则可以省略演员

select a.*, b.AreaCode
from TableA a left join (select distinct areacode from tableb) b 
    on left(cast(a.Phone as varchar(20)),3)=cast(b.AreaCode as varchar(20))  

答案 2 :(得分:0)

在teradata中,你可能需要这样的东西

fselect

答案 3 :(得分:0)

由于phone列中的某些值超出了INTEGER的最大允许限制,即2147483647,因此我假设BIGINT是数据类型。在这种情况下,下面是将返回所需结果的查询。

SELECT DISTINCT t1.Name,
                t1.Phone,
                t2.areacode
FROM t1
LEFT JOIN t2 ON substring(t1.Phone
                          FROM 11
                          FOR 3) = t2.areacode
ORDER BY 3 DESC;

substring不明确地将bigint投射到20个空格变量字符左对齐bigint需要20个字符,因此substring的起点为11。此外,teradata隐式将characterINT进行比较,因此无需cast areacode

其他选项是在trim之前使用substring删除前导空格,如下所示。

SELECT DISTINCT t1.Name,
                t1.Phone,
                t2.areacode
FROM t1
LEFT JOIN t2 ON substring(trim(t1.Phone)
                          FROM 1
                          FOR 3) = t2.areacode
ORDER BY 3 DESC;

DISTINCT用于避免重复,因为区号具有重复值,因此将其连接到电话记录表将创建重复的行。

<强>结果:

Name    Phone             areacode
----------------------------------
Jack    2,221,231,234     222
Jenny   2,224,321,234     222
Joe     1,111,231,235     111
John    1,111,231,234     111
Jody    3,323,214,211     ?

P.S。由于substringtrim功能在Teradata和MySQL中相同,您可以查看演示 here

希望这会有所帮助: - )