我正在尝试检索仅包含特定文本字符串的行。问题在于,有时我可以将文本字符串与其他文本字符串混合使用,并且在发生这种情况时,我不想检索此行。这是我正在使用的数据的概念:
MED_TABLE
______________________________________
med_code | med_name
______________________________________
1 calcium potassium iodine fluoride
2 potassium calcium
3 hydrochloride; calcium
4 iodine, calcium, fluoride
5 iodine calcium phosphate
6 calcium phosphate
7 IODINE
8 calcium PHOSPHATE iodine
如果我想返回单独包含或成对包含“磷酸钙”和/或“碘”字符串的行,那么有效的解决方法是什么?在这种情况下,我只想返回第5、6、7、8行。
我试图通过使用如下查询来做到这一点:
SELECT med_code, med_name
FROM med_table
WHERE lower(med_name) LIKE '%calcium phosphate%'
OR WHERE lower(med_name) LIKE '%iodine%'
但是这将返回包含我不需要的文本字符串的行。
答案 0 :(得分:0)
您必须用空字符串替换术语和逗号,然后修剪结果并检查长度是否为0:
SELECT med_code, med_name
FROM med_table
WHERE
length(trim(
regexp_replace(regexp_replace(regexp_replace(lower(med_name), 'calcium phosphate', ''), 'iodine', ''), ',', '')
)) = 0
请参见demo(对于MySql,区别在于使用replace
而不是Hive的regexp_replace
)。
结果:
| med_code | med_name |
| -------- | ------------------------ |
| 5 | iodine calcium phosphate |
| 6 | calcium phosphate |
| 7 | IODINE |
| 8 | calcium PHOSPHATE iodine |
答案 1 :(得分:0)
您可以将文本与like进行比较,然后只需比较列的长度即可得到上述预期的结果
SELECT med_code, med_name
FROM med_table
WHERE (lower(med_name) LIKE '%calcium phosphate%' AND length(Column)=18
OR WHERE (lower(med_name) LIKE '%iodine%' AND length(Column)= 7)
该列的长度应为LIKE子句的字符串的长度,检查该语法,就像刚在此运行时编写的一样。还要为诸如“磷酸钙碘”和“碘....”之类的字符串的组合添加条件。 / p>
答案 2 :(得分:0)
使用rlike
:
with your_data as (
select stack (8,
1,'calcium potassium iodine fluoride',
2,'potassium calcium',
3,'hydrochloride\\; calcium',
4,'iodine, calcium, fluoride',
5,'iodine calcium phosphate',
6,'calcium phosphate' ,
7,'IODINE',
8,'calcium PHOSPHATE iodine') as (med_code,med_name)
)
select * from your_data
where med_name rlike '(?i)calcium phosphate' --(?i) means case insensitive
or med_name rlike '^(?i)iodine$' --with string begin(`^`) and end(`$`) anchors
;
返回:
your_data.med_code your_data.med_name
5 iodine calcium phosphate
6 calcium phosphate
7 IODINE
8 calcium PHOSPHATE iodine
这在Hive中有效