impala sql只选择一定长度的数字

时间:2018-04-29 22:09:01

标签: sql cloudera impala

我有一个变量用作free-txt字段,数千行。

虽然它应该只包含帐号,但它也包含电话号码,文本或NULL。

我只需要提取包含帐号(8位数字段)的列。 我如何在SQL impala中存档它,特别是因为我们不仅有数字,还有文本。 此外,我需要知道帐号与其他帐号的百分比,以估算修复其他字段所需的时间。 如何才能做到这一点?  它看起来像这样:

accounts
---------
12345678
23456789
test only
34567890
23443256
23443257
021735547
23443258
23443259
23443260
call back
23443261
53443262
23443263
23443264
23443265
cancel
53443262
53443263
63443264
53443265
73443266
53443267

2 个答案:

答案 0 :(得分:0)

正则表达式对此有好处。尝试:

select regexp_extract(free_text_column, '^[0-9]{8}$',1) from your_table

要获得可以执行的百分比

select count(regexp_extract(free_text_column, '^[0-9]{8}$',1))/count(*)
from your_table

您可能需要将计数转换为浮点数,以使除法起作用。

答案 1 :(得分:0)

有趣。我会使用regexp_like()

select sum(case when regexp_like(col, '^[0-9]{8}$') then 1 else 0 end) as cnt,
       avg(case when regexp_like(col, '^[0-9]{8}$') then 1.0 else 0 end) as ratio
from t;