在SQL中出现特定文本字符串时检索行

时间:2019-05-31 18:36:19

标签: sql amazon-web-services hive apache-zeppelin

我正在尝试检索仅包含特定文本字符串的行。问题在于,有时我可以将文本字符串与其他文本字符串混合使用,并且在发生这种情况时,我不想检索此行。这是我正在使用的数据的概念:

    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%'

但是这将返回包含我不需要的文本字符串的行。

3 个答案:

答案 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中有效