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 では列名でデフォルト値を作成できませんでした。

4

1 に答える 1

2

これを行うために見過ごされがちな方法の 1 つは、テーブル メソッドを使用することです。以下の注意事項を参照してください。

これが最も近いものであるため、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)。パーサーは、どの関係を意味していたかを推測しません。

したがって、これはまったく計算された列ではありませんが、非常に近く、まるで 1 つのように使用できます。

于 2013-12-07T09:09:30.960 に答える