从微笑字符串而不是从元素列表中查找字母

问题描述

目标

如果字符串中的任何不区分大小写的字母字母(原子)不是来自元素H,B,C,N,O,F,Al,Si,P,S,Cl的以下列表,请过滤掉SMILES字符串,这是一个截断的列表。总共有38个元素。

背景

我有一个包含SMILES字符串的数据库

简化的分子输入行输入系统(SMILES)是行符号形式的规范,用于描述使用短ASCII字符串的化学物质的结构。

(更多信息Wikipedia link

微笑示例:

OC[C@H]1O[C@H]([C@H](O)[C@@H]1O)n1cnc2c(NC3CCCC3)ncnc12

这样做的目的是从数据库中消除稀有元素和有机金属。

解决方法

一种适用于任何版本的SQL的通用方法是创建一个包含不允许的原子符号黑名单的表。保留下来的微笑将是那些与任何列入黑名单的元素符号都不匹配的微笑。

WITH disallowed AS (
    SELECT 'He' AS symbol UNION ALL
    SELECT 'Li' UNION ALL
    SELECT 'Be' UNION ALL
    SELECT 'Ne' UNION ALL
    ...
    SELECT 'Lr'
)

SELECT t1.smile
FROM yourTable t1
WHERE NOT EXISTS (SELECT 1 FROM disallowed t2
                  WHERE t1.smile LIKE '%' || t2.symbol || '%');

如UO 2 之类的化合物将通过上述内部连接而被滤除,其中包含黑名单中的铀。