在 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 中出现特定文本字符串时检索行的主要内容,如果未能解决你的问题,请参考以下文章

如何从文本 kotlin 中检索特定字符串?

mysql特定字符出现次数统计

MySQL/SQL 检索文本字段的前 40 个字符?

在 SQL 列中找到特定字符串后更新文本

如何避免以特定符号开头的行中字符串的文本突出显示[java]

Python如何删除文本文件中特定字符串之后或之前的特定行数