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

Find alphabetical letter from a (smiles) string not from a list of elements

OBJECTIVE

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

背景

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

The simplified molecular-input line-entry system (SMILES) is a specification in the form of a line notation for describing the structure of chemical species using short ASCII strings.

(更多信息 Wikipedia link

微笑示例:

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

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

一种适用于任何版本 SQL 的通用方法是创建一个 table,其中包含不允许的原子符号黑名单。要保留的微笑将是与任何列入黑名单的元素符号不匹配的微笑。

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

诸如 UO2 之类的化合物将被上述内部连接过滤掉,其中包含列入黑名单的元素铀。