通过一些字符串操作,用来自另一个 table 的数据更新一个 table 中的数据

Update data in one table with data from another table with some string manipulation

我有两个数据库table如下:

content_definition
(
    content_definition_id bigint ,
    content_title character varying(100) NOT NULL,
    content_desc character varying(500),
    content_kwd character varying(300),
    content_view_url character varying(100),
    content_edit_url character varying(300),
    content_media_url character varying(300),
    content_type character varying(50),
    site_id integer
)

bl_address
(
    address_id bigserial NOT NULL,
    entity character varying(30),
    entity_id integer,
    address1 character varying(150),
    address2 character varying(50),
    city character varying(50),
    state character varying(50),
    zip character varying(15),
    country character varying(50),
)

我正在尝试创建一个 SQL 语句来更新第一个 table 中的 content_view_url 列,方法是在第二个 state 中附加其中的数据 table。第一个 table 中的 content_id 应该等于第二个 table 中的 entity_id。另外,我需要在追加的两个字符串之间包含 - 并且还需要用 - 替换 state 列中的所有空格并将其转换为小写,因为数据是 URL。

我尝试使用 concat 函数创建示例查询,但它对我不起作用:

update content_definition 
set content_view_url = CONCAT(select content_view_url 
                              from content_definition, '-test') 
where content_definition_id = 770764;

我收到错误:

ERROR: syntax error at or near "select"
SQL state: 42601
Character: 64

有什么办法可以实现吗?

在 Postgres 中,您可以在 UPDATE 中使用 FROM 子句。根据您问题中的查询:

update content_definition cd
    set content_view_url = cd2.content_view_url || '-test'
    from content_definition cd2
    where cd2.content_definition_id = 770764;

基于问题:

update content_definition cd
    set content_view_url = content_view_url || a.state
    from bl_address a
    where cd.content_id = a.entity_id;

或根据您的评论:

    set content_view_url = content_view_url || '-' || replace(a.state, ' ', '-')

多亏了这些建议,我正在寻找的查询是:

update content_definition cd
    set content_view_url = content_view_url || '-' || lower(replace(a.state, ' ' , '-'))
    from bl_address a
    where cd.content_id = a.entity_id and cd.content_type = 'business.location' and cd.site_id = 35;