Sql 如何在所有行中搜索文本,而不单独指定每一列
例如 给定下表和数据,查找包含单词“on”的行(不区分大小写) 简单(但有限)的解决方案 此解决方案仅与包含“基元”类型的表相关Sql 如何在所有行中搜索文本,而不单独指定每一列,sql,hadoop,hive,apache-spark-sql,hiveql,Sql,Hadoop,Hive,Apache Spark Sql,Hiveql,例如 给定下表和数据,查找包含单词“on”的行(不区分大小写) 简单(但有限)的解决方案 此解决方案仅与包含“基元”类型的表相关 (无结构、数组、映射等) 该解决方案的问题是,所有列都没有分隔符(否,concat_ws(*)产生一个异常),因此边界中的单词变成单个单词,例如- Greyhound和On变成GreyhoundOn select i ,regexp_replace(concat(*),'(?i)on','==>$0<==') as rec from
(无结构、数组、映射等)
该解决方案的问题是,所有列都没有分隔符(否,
concat_ws(*)
产生一个异常),因此边界中的单词变成单个单词,例如-Greyhound
和On
变成GreyhoundOn
select i
,regexp_replace(concat(*),'(?i)on','==>$0<==') as rec
from t
where concat(*) rlike '(?i)on'
;
选择cast(拆分(rec,\\x01')[0]作为int)作为i
,regexp_replace(regexp_replace(rec),(?ix)\\b on\\b','=>0美元
select i
,regexp_replace(concat(*),'(?i)on','==>$0<==') as rec
from t
where concat(*) rlike '(?i)on'
;
+---+-----------------------------------------------------------------------------------------------------------+
| | rec |
+---+-----------------------------------------------------------------------------------------------------------+
| 1 | 12017-03-15Now we take our timeso n==>on<==chalantAnd spend our nights so b==>on<== vivant |
| 2 | 22017-03-16Quick as a winkShe changed her mindShe stood ==>on<== the tracks |
| 3 | 32017-03-17But I’m talking a Greyhound==>On<== the Huds==>on<== River LineI’m in a New York state of mind |
+---+-----------------------------------------------------------------------------------------------------------+
select i
,regexp_replace(concat(*),'(?ix)\\b on \\b','==>$0<==') as delim_rec
from (select i
,printf(concat('%s',repeat('|||%s',field(unhex(1),*,unhex(1))-2)),*) as delim_rec
from t
) t
where delim_rec rlike '(?ix)\\b on \\b'
;
+---+------------------------------------------------------------------------------------------------------------------+
| i | delim_rec |
+---+------------------------------------------------------------------------------------------------------------------+
| 2 | 22|||2017-03-16|||Quick as a wink|||She changed her mind|||She stood ==>on<== the tracks |
| 3 | 33|||2017-03-17|||But I’m talking a Greyhound|||==>On<== the Hudson River Line|||I’m in a New York state of mind |
+---+------------------------------------------------------------------------------------------------------------------+
create external table t_ext (rec string)
row format delimited
fields terminated by '0'
location '/user/hive/warehouse/t'
;
select cast(split(rec,'\\x01')[0] as int) as i
,regexp_replace(regexp_replace(rec,'(?ix)\\b on \\b','==>$0<=='),'\\x01','|||') as rec
from t_ext
where rec rlike '(?ix)\\b on \\b'
;
+---+-----------------------------------------------------------------------------------------------------------------+
| i | rec |
+---+-----------------------------------------------------------------------------------------------------------------+
| 2 | 2|||2017-03-16|||Quick as a wink|||She changed her mind|||She stood ==>on<== the tracks |
| 3 | 3|||2017-03-17|||But I’m talking a Greyhound|||==>On<== the Hudson River Line|||I’m in a New York state of mind |
+---+-----------------------------------------------------------------------------------------------------------------+