PostgreSQL如何识别是否需要引用值

PostgreSQL如何识别是否需要引用值,postgresql,plpgsql,dynamic-sql,Postgresql,Plpgsql,Dynamic Sql,我试图编写一个动态创建sql语句的函数,但我面临类型转换的问题,因此,如果需要引用字段类型,如何使用该字段类型进行标识 -使用它,我可以恢复每个字段的类型 -但是我没有一个简单的方法来表达它所需要的特定类型 -引用 创建表测试 序列号不为空, 员工姓名文本, 工资小数点12,2, 租用日期, 活动布尔 ; 选择列名称、数据类型、null作为需要引用的列 从信息_schema.columns 其中table_name='table_name'; quote_ident docs说: 返回适当引用的

我试图编写一个动态创建sql语句的函数,但我面临类型转换的问题,因此,如果需要引用字段类型,如何使用该字段类型进行标识

-使用它,我可以恢复每个字段的类型 -但是我没有一个简单的方法来表达它所需要的特定类型 -引用 创建表测试 序列号不为空, 员工姓名文本, 工资小数点12,2, 租用日期, 活动布尔 ; 选择列名称、数据类型、null作为需要引用的列 从信息_schema.columns 其中table_name='table_name'; quote_ident docs说:

返回适当引用的给定字符串,以用作SQL语句字符串中的标识符。只有在必要时才添加引号

但这并不是我所期望的:

在测试中插入员工姓名、工资、雇用日期、在职 值quote_identity'John Doe',quote_identity100000,quote_identitycurrent_date,quote_identitytrue; 这是必要的,因为我正在尝试以友好的方式生成语句字符串

我在一些表中插入了一些值,我可以发现每个值的类型,但是要生成insert string语句,我应该知道是否应该引用特定的值类型,例如

text:type应在string语句中引用 布尔值:不应引用 数字:不应引用 日期:应引用
不要引用。引用增加了复杂性,如果你没有得到正确的答案,它就有了

而是使用绑定参数。细节取决于您使用的数据库库,但基本思想始终是一样的。首先用占位符为您的值准备语句。然后通过传入值来执行它。数据库负责将值放入语句中。您可以多次执行同一条准备好的语句,以优化编码和数据库调用

这是你在家里的做法。链接文档中有很多关于安全执行动态查询的信息

do $$
begin
  execute '
    insert into test (employee_name, salary, hire_date, active) 
    values ($1, $2, $3, $4)
  ' using 'John Doe', 100000, current_date, true;
end;
$$;
此外,虽然编写SQL构建器是一个很好的练习,但它也非常复杂,而且很容易出错。有很多库可以为您构建SQL

下面是您使用PHP的声明


如果您对SQL构建器的工作方式感到好奇,可以在Laravel内部挖掘想法。用PL/pgSQL编写一个是雄心勃勃的,但我不知道有哪一个存在。祝你好运

quote_ident不用于常量值-仅用于标识符。您可能正在查找quote_文字或格式,或使用。。。但我不清楚您到底想实现什么您应该对_列名使用quote_ident `尽管如此,为了确保这些标识符被正确引用我有一个要插入到某个表中的值,我可以发现每个值的类型,但要生成insert string语句,我应该知道是否应该引用特定的值类型。例如,字符串语句中应该引用文本类型。布尔值不应该被引用。数字值不应该被引用。日期应该被引用。请遵循问题的最后一个列表,即不要对数字和布尔值类型使用引号。所有类型的值都可以被引用,所以当你不小心使用了多余的引号时,没有什么不好的事情发生plpgsql@HerbertPimentel对不起,我脑子里想起来你在用PHP。我已经用一个PL/pgSQL示例更新了答案。谢谢,但问题是我需要像使用laravel一样以友好方式生成string语句。postgres还有一个问题,就是如何将一个值数组扩展到using子句。检查@HerbertPimentel您的想法是否存在问题,因为您不能像这里一样将多个类型放入一个数组中。您可以将它们全部转换为文本,并希望Postgres能够正确地将它们转换回文本,但这会增加复杂性和bug。取而代之的是,考虑SQL生成器只有语句,使用上面的绑定参数,并返回名称。让用户。
do $$
begin
  execute '
    insert into test (employee_name, salary, hire_date, active) 
    values ($1, $2, $3, $4)
  ' using 'John Doe', 100000, current_date, true;
end;
$$;
DB::table('test')->insert([
  'employee_name' => 'John Doe',
  'salary' => 100000,
  'hire_date' => current_date,
  'active' => true
);