正则表达式是非ANSI风格的连接?

时间:2009-12-10 21:55:46

标签: sql regex

我们的一条规则是所有database joins have to be ANSI-style。作为构建过程的一部分,我想扫描所有针对违规行为的源代码控制联接。

我得到了一个部分答案,我将在下面发布,但我确定它遗漏了一些东西并且必须有一个更好的答案。

以下是一个非全面的示例列表

应匹配:

SELECT * 
FROM cats, owners, dogs
WHERE cats.owner = onwers.id and owners.id += dogs.owner;


SELECT * FROM cats c, owners o WHERE c.owner = o.id;

不应该匹配:

SELECT *
FROM owners left outer join cats on (owners.id = cats.owner);

SELECT * 
   FROM owners inner join cats on (cats.owners = GetOnersOfTabbies(param1, parm2))

3 个答案:

答案 0 :(得分:2)

好吧,我走了:

FROM [\s\S]*?,[\s\S]*?WHERE

即使在多行查询中,也会在,FROM子句之间匹配WHERE

[\s\S]*?表示:将smallest possible match用于空格字符(包括换行符)和非空格字符;这也被称为“非贪婪模式”。

答案 1 :(得分:1)

这是我的正则表达式:

from\s+\w+(\s+)?(\w+)?,(\s+)?\w+
在我的正则表达式测试中,Ruben的回答对我不起作用。

\s     == space character
\s+    == 1+ space character(s)
(\s+)? == Within the brackets is optional, reqires a "?" immediately after the ")"
\w     == word character, alphanumeric

要抓住SELECT * FROM (cats c, owners o) WHERE c.owner = o.id;,请使用:

from\s+(\()?\w+(\s+)?(\w+)?,(\s+)?\w+

您需要使用\字符转义括号:

(\()?  == '(' character

答案 2 :(得分:0)

这是我的尝试:

FROM (\s*\S+\s*(\w\s*)*,)+

应该从from子句中获取第一个逗号 - 这些是旧式连接所必需的。