我只是想知道是否有一种既定的方法来测试字符串是否可以用作不带引号的PostgreSQL 标识符?(不加引号是因为几乎任何字符串都可以是带引号的标识符)。
我问是因为如前一个问题(How to quote qualified table name with format() function?)所示,有时我需要指定一个标识符(例如要创建的表的名称)而不是还存在,作为字符串值 ( text
) 而不是更安全的类型,例如regclass
. 引用字符串/名称可能会出现问题,如此处和其他地方所示。没有引用,它容易受到 SQL 注入的影响。
我想如果一个程序足够难,最终可以编写一个字符串解析函数。只是想检查是否有现有的解决方案。
有关的:
函数 PARSENAME() 是 QUOTENAME() 的对立面吗(sql-server)
这是我根据@a_horse_with_no_name 的评论最终使用的。
这个想法是如果不需要(即当输入已经是一个简单标识符时) ,
format
函数 (with%I
) 将不会添加任何引号。我还在比较之前将标识符名称规范化为小写字母lower()
,这可能需要也可能不需要,具体取决于标识符是否应该不区分大小写或敏感。示例输出: