我的表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
答案 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隐式将character
与INT
进行比较,因此无需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。由于substring
和trim
功能在Teradata和MySQL中相同,您可以查看演示 here
希望这会有所帮助: - )