我在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用列名创建默认值。
答案 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)
,并且解析器不会猜测您可能想要的关系。
因此它不是一个非常接近计算的列,但它非常接近,可以像使用它一样可用。