【问题标题】:Placeholder while retrieving data from table从表中检索数据时的占位符
【发布时间】:2014-10-08 04:21:02
【问题描述】:

我有一个包含常见主题文本的表,需要在运行时插入一些字符串。例如下面:

CREATE TABLE certification.cert_email_dtls (
 cert_eid_id numeric(10,0),
 cert_eid_email_body character varying(8000),
);

insert into certification.cert_email_dtls(1,'hello world <blank-value1>);
insert into certification.cert_email_dtls(2,'hello guys <blank-other-value2>);
insert into certification.cert_email_dtls(3,'hello <blank-value3> india <some-other-value4>);

等等。 &lt;some-value&gt;,&lt;some-other-value&gt; 等在运行时出现。

SELECT cert_eid_id ,
       cert_eid_email_body,
INTO   v_id,
       v_email_body_end
FROM certification.cert_email_dtls where cert_eid_id = in_id;

我的要求是插入介于两者之间的一些值并生成最终的电子邮件正文。

【问题讨论】:

  • 一方面,PostgreSQL有replace()regex_replace()string functions。另一方面,是否有令人信服的理由使用 SQL 而不是使用应用程序代码来做到这一点?
  • 有多少个不同的占位符?它们是唯一的还是可以在多行中弹出?您是检索单行还是一次检索多行?一行可以有多少个占位符?这应该是服务器端函数中的 SQL 或 PL/pgSQL 代码吗?并且总是,请使用您的 Postgres 版本。

标签: sql postgresql placeholder


【解决方案1】:

format() 可能是完美的工具。阅读手册中的详细信息。

如果您可以将cert_eid_email_body 保存为兼容格式,例如:

CREATE TABLE cert_email_dtls (
   cert_eid_id         serial PRIMARY KEY
 , cert_eid_email_body text
);

INSERT INTO cert_email_dtls (cert_eid_email_body)
VALUES ('hello %1$s india %2$s');

整个操作可以这么简单:

SELECT format(cert_eid_email_body, 'foo', 'bar', 'baz') AS cert_eid_email_body
FROM   cert_email_dtls
WHERE  cert_eid_id = 1;

结果:

cert_eid_email_body
-------------------
hello foo india bar

请注意,第三个参数 'baz' 被忽略,因为它没有在字符串中引用。

SQL Fiddle.

旁白:不要将numeric(10,0) 用作ID 或主键。 integer or bigint 通常为您提供更好的服务。应该使用上面的serial PRIMARY KEY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2012-11-20
    • 1970-01-01
    • 2013-09-13
    • 2019-07-25
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多