SQL-使用子查询SELECT的结果为SELECT构造正则表达式吗?

时间:2019-03-24 20:01:26

标签: sql sqlite

我发现自己处于这种情况。

我有一个看起来像这样的表:

TableA
ID  Name
1   First
2   Second
3   Third
...

我还有第二张桌子,看起来像这样:

TableB
ID   Name
...
95   Fifth
96   First
97   First121
98   Third9
99   1Second22
100  Fourth
...

我试图找出如何完全按照以下格式查找表B中的任何记录: ^ [表A中的子字符串] [0-9] *

因此,记录97和98应该位于结果集中。如果有96和99,我可以解决,但理想情况下我不愿意。

从本质上讲,我试图弄清楚如何使用WHERE IN / JOIN语法在表B中查找表中的记录,而将结果集用作正则表达式的一部分。

因为我在带有node.js sqlite库的Javascript上下文中使用了它,所以理论上我可以返回所有匹配项,并根据上一个查询的返回情况,手动构建带有占位符的WHERE语句链:

SELECT *
FROM TableB
WHERE name REGEXP '^(?)[0-9]*' OR
      name REGEXP '^(?)[0-9]*' OR

对于表A中的每个值都有一个(?)占位符。我想知道是否有可能在一个语句中执行此操作,因为这感觉非常笨拙。理想情况下,我正在拍摄类似这样的图片,但是它不能按原样工作:

SELECT *
FROM TableB
WHERE name REGEXP '^(SELECT ...)[0-9]*'

1 个答案:

答案 0 :(得分:0)

使用existsjoin

select b.*
from b
where exists (select 1
              from tablea a
              where b.name regexp concat(a.name, '[0-9]*')
             );

如何指定正则表达式。如果您不想使用'First',请使用:

where exists (select 1
              from tablea a
              where b.name regexp concat('^', a.name, '[0-9]+')
             );