PostgreSQL的。使用连接其他列的值的列创建表

时间:2013-11-08 08:23:23

标签: sql-server postgresql concatenation create-table

我在MSSQL中创建了表脚本:

CREATE TABLE [dbo].[Address](
    [Id] [int] IDENTITY(1,1) NOT NULL,
        [Street] [nvarchar](100) NOT NULL,
    [BuildingNumber] [nvarchar](15) NULL,
    [ApartmentNumber] [nvarchar](15) NULL,
        [City] [nvarchar](100) NOT NULL,
    [Country] [nvarchar](250) NULL,
        [Postcode] [nvarchar](15) NULL,
    **[Search]  AS (((((((([Street]+' ')+[BuildingNumber])+' ')+isnull([ApartmentNumber],''))+' ')+[Postcode])+' ')+[City]) PERSISTED,**
 CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

如何使用PostgreSQL中其他列的值创建“搜索”列?我试图设置DEFAULT值,但是Postgresql没有让mi用列名创建默认值。

1 个答案:

答案 0 :(得分:2)

一种经常被忽视的方法是使用表格方法。请参阅下面的警告。

注意,我正在将id转换为串行类型,因为它是最接近的等价物。我将把它留给你,如果有的话,在postgreSQL中将字段改为TEXT类型。

CREATE TABLE dbo.address(
    id serial PRIMARY KEY,
    street varchar(100) NOT NULL,
    building_number varchar(15) NULL,
    apartment_number varchar(15) NULL,
    city varchar(100) NOT NULL,
    country varchar(250) NULL,
    postcode varchar(15) NULL
);

CREATE OR REPLACE FUNCTION search(dbo.address) LANGUAGE SQL RETURNS text AS
$$
select $1.street || ' ' || coalesece($1.building_number, '') || ' ' || 
       coalesce($1.apartment_number,'') || ' ' || coalesce($1.postcode, '') 
       || ' ' || $1.city
$$ IMMUTABLE;

在作为参数提供的行上注意此函数,而不是在基础表上。然后它可以被标记为不可变,因为它只取决于它的参数。

如果我们想坚持下去,我们就会使用功能索引:

CREATE INDEX address_search_idx ON dbo.address(search(address));

然后我们可以使用与列语法类似(但不完全相同)的语法来查询它:

SELECT * FROM dbo.address a WHERE a.search like '313 Baker St%';

请注意,您不能忽略a.中的a.search,因为解析器将其更改为search(a),并且解析器不会猜测您可能想要的关系。

因此它不是一个非常接近计算的列,但它非常接近,可以像使用它一样可用。