正则表达式以验证字符串是否为有效的SQL列名称

时间:2018-10-23 10:24:08

标签: sql postgresql

我正在搜索正则表达式以验证字符串是否可以是有效的SQL列名称。

我想使用PCRE语法。

到目前为止,我发现了这一点

[\w-]+

但是我认为这还不够。我也见过/(在SAP中)。

AFAIK规范是封闭源代码(您需要为此付费)。

从文档(Python re)

  

\ w       匹配Unicode单词字符;其中包括大多数可以是任何语言单词的一部分的字符,以及数字和   下划线。如果使用ASCII标志,则仅匹配[a-zA-Z0-9 _]。

正则表达式如何验证SQL列名?

该字符串应该可以像my_column这样使用。

AFAIK保留字有效,因为您可以这样使用它们:

select * from my_table where "where" = 'here'

“ where”是列的名称。正则表达式不需要关心保留字。

2 个答案:

答案 0 :(得分:3)

manual clarifies

  

SQL标识符和关键字必须以字母(a-z   带变音符号的字母和非拉丁字母的字母)或下划线   (_)。标识符或关键字中的后续字符可以是   字母,下划线,数字(0-9)或美元符号($)。注意   根据标识符的字母,不允许在符号中使用美元符号   SQL标准,因此它们的使用可能会使应用程序减少   便携式的。 SQL标准不会定义包含以下内容的关键字   数字或下划线开头或结尾,因此此标识符   表单可以避免与将来的扩展名冲突   标准。

     

系统使用的标识符不超过NAMEDATALEN-1个字节;   较长的名称可以写在命令中,但是会被截断。   默认情况下,NAMEDATALEN为64,因此最大标识符长度为63   个字节。如果此限制有问题,可以通过更改   NAMEDATALEN中的src/include/pg_config_manual.h常量。

并且:

  

还有第二种标识符:带分隔符的标识符或   带引号的标识符。它是通过包围任意顺序的   双引号(")中的字符。 [...]

     

带引号的标识符可以包含任何字符,但该字符除外   代码为零。 (要包括双引号,请写两个双引号。)   这允许构造表或列名,否则   不可能,例如包含空格或“&”号的空格。的   长度限制仍然适用。

还有更多,您甚至可以使用转义的Unicode字符,例如:U&"d\0061t\+000061"。阅读整章。

因此,一旦名称用双引号括起来,有效的标识符中允许使用除字符为零以外的任何字符的。如果没有双引号,则即使简单的字符串(例如“ select”)也恰好是reserved words,它们也可能无效。 (保留字的概念很不幸,由SQL标准设置,现在很难更改。)

您可以使用quote_ident()让Postgres完成工作:

SELECT quote_ident('0of') = '0of';
  

仅在必要时添加报价。

表达式返回true以获取有效的标识符。或者只是使用quote_ident('$identifier')的结果来获得合法名称(在两种情况下都可以引用)。

答案 1 :(得分:2)

如果我们遵循PostgreSQL文档:

  

SQL标识符和关键字必须以字母(a-z,以及带变音符号和非拉丁字母的字母)或下划线(_)开头。标识符或关键字中的后续字符可以是字母,下划线,数字(0-9)或美元符号($)。请注意,根据SQL标准[...]

的字母,不允许在标识符中使用美元符号。

我们可以为这样的标识符编写正则表达式:

^([[:alpha:]_][[:alnum:]_]*|("[^"]*")+)$

正则表达式的第二个分支负责带引号的标识符。