Posted by アイ・エス・シーシステム事業部
on 2011年11月22日 in SQL,プログラミング,技術


「SQL・・・わすれたころに また悩む」
 さとう 心の一句

結構重宝しそうなこんなテクニックをご紹介↓↓

複数行返ってくるサブクエリを文字列に連結して取得するSQLまとめ – hikky nikky.

えっと、結構ちゃんと正規化してるテーブル構成だといろんなところに派生しちゃってある項目は複数返ってきちゃって・・・でも一行に表示しなくちゃいけなくて・・・

みたいなときにやっちゃう技。

MySQL版は意外に簡単ですね。
以前、Oracleでやったことがあるんですが、無理やりっちゅう感じです。
XMLにして文字列操作してゴニョゴニョ・・・・

でも、覚えていて損はないSQLです。

Posted by アイ・エス・シーシステム事業部
on 2011年08月03日 in SQL,技術


PHP+PostgreSQL(8.2.4)用に開発したアプリケーションをPHP+MySQL(5.1.22)に移植しようとした際に引っかかった点を書き残しておきます。

まず、はじめに私自身はどちらかというとOracleのSQLが最も得意で
あとは順に MySQL>SQLServer>PostgreSQL>Other という感じのスキルです。

で、今回、PHP+PostgreSQLでの開発だったのですが
PostgreSQLが大得意な方ならもっとこう違った書き方があるじゃん!という書き方をしていない前提です。

なので普段MySQL向けのSQLを書くことが多い方がPostgreSQLを使用する場合の注意点と言ってもいいかもしれません。

では、本題。

【日付の計算が違う】
例えば
データ投入日付が10日以内のデータを表示する・・・
みたいなSQL文です。

PostgreSQLの場合
[sql]
SELECT *
FROM user_tbl
WHERE CAST(insert_date AS DATE) + CAST(’10 days’ AS INTERVAL) >
current_timestamp
[/sql]
こんな感じ・・・

MySQLの場合だと
[sql]
SELECT *
FROM uset_tbl
WHERE DATE_ADD(insert_date, INTERVAL 10 DAY) > NOW()
[/sql]
こんな感じになります。

結構、こんな感じのSQLが多いと大変ですね。

【LIMIT OFFSETの使い方が違う】
PostgreSQLの場合は
[sql] 
offset 100 limit 10
[/sql]
と書いた場合
100件目から10件抽出 という意味なんですが

MySQLの場合は
[sql]
limit 100,10
[/sql]

100件目から10件抽出になります。
MySQL5以降の場合実はPostgreSQLから継承した書き方も出来ます。
[sql]
limit 10 offset 100
[/sql]
これも同じです。(10件中抽出、100件目から。)

で、問題なのが、PostgreSQLの場合は 「100件目から全部」みたいなSQL
[sql]
offset 100
[/sql]

が書けるのに対し、MySQLでは「limit」を書かずに「offset」を書くことが出来ないため
同じSQLは書けません。
※実際に試してNGだったのと、いろいろ調べましたがどの文献も「limit」の限界ありきのものしかなく「offset」の使用に関しても「limit」ありきな見解だったので「出来ない」と思っています。なにか手は無いものでしょうか。
※まぁ、Oracleならもっと複雑に書くべきところなので仕方ないですね。PostgreSQLのメリットということで・・・
※参考まで・・・Oracleでのlimit,offsetもどきを実践してくださっている文献

【MySQLのauto_incrementは・・・PostgreSQLで・・・】
MySQLのauto_increment はPostgreSQLで SERIAL になります。
具体的には

MySQL
[sql]
CREATE TABLE tablename (
colname MEDIUMINT NOT NULL AUTO_INCREMENT
);
[/sql]

PostgreSQLでは・・・・

[sql]
CREATE TABLE tablename (
colname SERIAL
);
[/sql]
すでに存在するテーブルに対して追加で行う場合は
[sql]
ALTER TABLE tablename ADD COLUMN 列名 SERIAL
[/sql]
となります。



今回あまり複雑なSQLを書いていないのでこのくらいです。

ページトップへ戻る

Get Adobe Flash player