2

我在 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 使用列名创建默认值。

4

1 回答 1

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.from,a.search因为它由解析器更改为search(a),并且解析器不会猜测您可能指的是哪些关系。

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

于 2013-12-07T09:09:30.960 回答