【问题标题】:Search for any of a list of strings inside another string在另一个字符串中搜索任何字符串列表
【发布时间】:2019-08-26 05:42:40
【问题描述】:

我需要通过将地址字段与类似街道的单词列表进行比较来识别具有有效地址的记录。

所以代码看起来像:

set street_list = 'STREET', 'ROAD', 'AVENUE', 'DRIVE', 'WAY', 'PLACE' (etc.)
; 

create table [new table] as 
select * 
from [source table] 
where [address line 1] (contains any word from STREET_LIST) or 
      [address line 2] (contains any word from STREET_LIST) or 
      [address line 3] (contains any word from STREET_LIST)
; 

这可能吗?

使用 LostReality 的正则表达式建议,我得到了:

select * 
from [source table]
where upper([address line 1]) regexp '.* STREET.*|.* ST.*|.* ROAD.*|.* RD.*|.* CLOSE.*|.* LANE.*|.* LA.*|.* AVENUE.*|.* AVE.*|.* DRIVE.*|.* DR.*|.* HOUSE.*|.* WAY.*|.* PLACE.*|.* SQUARE.*|.* WALK.*|.* GROVE.*|.* GREEN.*|.* PARK.*|.* PK.*|.* CRESCENT.*|.* TERRACE.*|.* PARADE.*|.* GARDEN.*|.* GARDENS.*|.* COURT.*|.* COTTAGES.*|.* COTTAGE.*|.* MEWS.*|.* ESTATE.*|.* RISE.*|.* FARM.*' 
; 

而且它似乎有效。

但是我有两个小问题:

1) 如何将正则表达式写在多行上以便于阅读?

2) 有什么方法可以将该正则表达式放入宏变量中,因为我想检查 5 个地址行并且我不想要同一表达式的 5 个副本。

谢谢

【问题讨论】:

  • 如果 hiveQL 不支持,您可以将这些值输入到临时表中并使用 WHERE IN 子句
  • 嗨,dustytrash,我是 Hive 的新手,所以我还没有看到那个。语法是什么?谢谢
  • 嗨,你有没有尝试使用 RLIKE 运算符?您可能可以从列表中生成一个正则表达式并将其用作单个条件?

标签: sql string hive


【解决方案1】:

Hive 解决方案。您可以将正则表达式模式放入变量中,也可以使用宏,修复您的模板:

set hivevar:street_list ='STREET|ST|ROAD|RD|CLOSE|LANE|LA|AVENUE|AVE|DRIVE|DR|HOUSE|WAY|PLACE|SQUARE|WALK|GROVE|GREEN|PARK|PK|CRESCENT|TERRACE|PARADE|GARDEN|GARDENS|COURT|COTTAGES|COTTAGE|MEWS|ESTATE|RISE|FARM';

--boolean macro for using in the WHERE
create temporary macro contains_word(s string) (upper(s) rlike ${hivevar:street_list} ) ;

with some_table as ( --use your table instead of this synthetic example
select stack(2,'some string containing STREET and WALK',
               'some string containing something else') as str
) --use your table instead of this synthetic example

--use macro in your query
select str from some_table 
 where contains_word(str); 

结果:

OK
some string containing STREET and WALK
Time taken: 0.229 seconds, Fetched: 1 row(s)

在你的问题中使用OR

where contains_word(address_line_1) OR contains_word(address_line_2) ...

希望你有这个想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2021-11-28
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多