ACCESSのクエリをPostgreSQLのSQL文に変換する


2006.1 ACCESS 2000 SP-3 + PostgreSQL 8.0.4

パススルークエリやODBC Direct、ADOを使う場合、そこで用いるSQL文はPostgreSQL用のSQL文で記述しなければいけません。ACCESSのクエリのSQL文をそのまま用いても、そのSQLはPostgreSQLには理解できない方言である可能性があります。

ここではACCESSのクエリをSQLビューで表示した場合のSQLと、それをPostgreSQLで実行できるように改造したSQL文を対比しながら説明します。(関数の変換はこちら。)
クエリ例で使用しているテーブルは、リンクテーブルではダメなのかで使用したものです。

日付書式 (#mm/dd/yyyy#は'yyyy-mm-dd'へ)

例 売上日が2005/12/1のレコードを選択するSQL文

ACCESSクエリ PostgreSQL用のSQL文
SELECT t_売上.*, t_売上.売上日
FROM t_売上
WHERE (((t_売上.売上日)=#12/1/2005#));
SELECT *
FROM t_売上
WHERE 売上日='2005-12-1';

 

文字列・文字列連結演算子・識別子引用符 (""は''へ &は||へ)

例 商品名が"定規"のレコードをふりがなを付けて選択するSQL文

ACCESSクエリ PostgreSQL用のSQL文
SELECT t_商品台帳.商品cd, t_商品台帳.商品名
, [商品名] & " じょうぎ" AS 読み
FROM t_商品台帳
WHERE (((t_商品台帳.商品名)="定規"));;
SELECT 商品cd, 商品名, "商品名" || ' じょうぎ' AS 読み
FROM t_商品台帳
WHERE 商品名='定規';

 列名"商品名"をACCESSでは[]で囲みますが、PostgreSQLでは""で囲みます。テーブル名や列名に空白を含むものを使ってしまった場合やSQLの予約語を使ってしまった場合は、SQL文中で識別子の引用符で囲う必要があります。

 

ワイルドカード (*は%へ)

例 商品名が"定規"で始まるレコードを選択するSQL文

ACCESSクエリ PostgreSQL用のSQL文
SELECT t_商品台帳.商品cd, t_商品台帳.商品名
FROM t_商品台帳
WHERE (((t_商品台帳.商品名) Like "定規*"));
SELECT 商品cd, 商品名
FROM t_商品台帳
WHERE 商品名 LIKE '定規%';

 

DELETE文

例 売上noが1のレコードを削除するSQL文

ACCESSクエリ PostgreSQL用のSQL文
DELETE t_売上.*, t_売上.売上no
FROM t_売上
WHERE (((t_売上.売上no)=1));
DELETE 
FROM t_売上 
WHERE 売上no=1;

TOP

例 商品コードの小さいもの順5つを選択するSQL文

ACCESSクエリ PostgreSQL用のSQL文
SELECT TOP 5 t_商品台帳.商品cd, t_商品台帳.商品名
FROM t_商品台帳
ORDER BY t_商品台帳.商品cd;
SELECT 商品cd, 商品名
FROM t_商品台帳
ORDER BY 商品cd
LIMIT 5;

 ACCESSのTOPではTOP 5 PERCENTのようにパーセント指定が可能ですが、PostgreSQLのLIMITにはこれに相当する機能がありません。

 

JOINつきUPDATE文

例 売上日が2005/12/1以降の売上について、商品分類cdが1の商品の売り単価を10%UPするSQL文

ACCESSクエリ PostgreSQL用のSQL文
UPDATE t_売上
 INNER JOIN t_商品台帳 ON t_売上.商品cd=t_商品台帳.商品cd
SET t_売上.単価 = [単価]*1.1
WHERE (((t_商品台帳.商品分類cd)=1)
 AND ((t_売上.売上日)>=#12/1/2005#));
UPDATE t_売上
SET 単価 = 単価*1.1
FROM t_商品台帳
WHERE t_売上.商品cd=t_商品台帳.商品cd
 AND t_商品台帳.商品分類cd=1
 AND t_売上.売上日>='2005-12-1';

テーブルを結合した更新クエリは、ACCESSとPostgreSQLで書式が相当に異なります。


MS ACCESSからPostgreSQLへ移行するに戻る TOPに戻る