在 SQL 中出现特定文本字符串时检索行
Posted
技术标签:
【中文标题】在 SQL 中出现特定文本字符串时检索行【英文标题】:Retrieving a row when specific text strings occur in SQL 【发布时间】:2019-10-17 09:44:39 【问题描述】:我正在尝试检索仅包含特定文本字符串的行。问题是有时文本字符串可以与其他文本字符串混合在一起,当这种情况发生时,我不想检索这一行。以下是我正在处理的数据的一个想法:
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%'
但这会返回包含我不想要的文本字符串的行。
【问题讨论】:
请标注数据库平台 【参考方案1】:您可以将文本与 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 子句的字符串长度 检查刚刚编写此运行时的语法 还添加字符串组合的条件,如“磷酸钙碘”和“碘......”
【讨论】:
【参考方案2】:您必须将术语和逗号都替换为空字符串,然后修剪结果并检查长度是否为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 |
【讨论】:
【参考方案3】:使用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 中有效
【讨论】:
以上是关于在 SQL 中出现特定文本字符串时检索行的主要内容,如果未能解决你的问题,请参考以下文章