sqlite:在模式列表中通配

sqlite: globbing in a list of patterns

我有一个 GLOB 模式列表(长度未知),并且想要 SELECT 所有匹配 任何 模式的条目。

天真的方法是:

SELECT name, age
WHERE name GLOB 'John*' OR name GLOB 'Mar*'
;

然而,这似乎非常笨拙(尤其是在有很多模式的情况下)。

做完全匹配时,我可以使用IN关键字,像这样:

SELECT name, age
WHERE name IN ('John', 'Mary')
;

所以我想知道,我是否可以用 GLOB 做类似的事情,例如像这样(显然是行不通的例子):

SELECT name, age WHERE name GLOB IN ('John*', 'Mar*');

使用 returns 您想要的所有模式的 CTE,并在主查询中使用 EXISTS 检查是否有任何匹配:

WITH cte(pattern) AS (VALUES ('John*'), ('Mar*'))
SELECT t.*
FROM tablename t
WHERE EXISTS (SELECT 1 FROM cte c WHERE t.name GLOB c.pattern);

EXISTS returns 一旦找到第一个匹配项,不需要检查所有模式。

参见demo