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。
我有一个 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。