37 件中 1 - 10 件を表示
次の 10 件 »
Displaying posts with tag: Firebird/InterBase (reset)
Firebirdの分析関数の衝撃(13) 関係除算を表現する

Firebirdの分析関数の衝撃(13) 関係除算を表現する

本エントリはFirebird Advent Calendar 2018 の19日目です。

2. 関係除算を表現する

ミックさんの以下のエントリにあるように関係除算の標準的な定義はありません。

注意4:除算の標準的な定義がない

そのため、プログラマのためのSQL 第4版にあるようにさまざまな方法が考えられます。
「27.2 関係除算」参照のこと。ここでも書かれているように関係除算には二種類あります。

[さらに読む]
Firebirdの分析関数の衝撃(12) 2つのテーブルが相等であるかどうか

Firebirdの分析関数の衝撃(12) 2つのテーブルが相等であるかどうか

本エントリはFirebird Advent Calendar 2018 18日目のエントリです。

1. 2つのテーブルが相等なら「等しい」、そうでなければ「異なる」を返すクエリ

INTERSECTとEXCEPTがないFirebird(とMySQL)にとっては、この書き換えは迷宮のようなわけのわからなさになることうけあいです。そのため、以下のように一番短い(そのように見える)以下のクエリを題材にしましょう。

-- window関数で書き換えたSQL
select case when count(*) = 0
then '等しい'
else '異なる' end as result …

[さらに読む]
NULLと重複行に対するEXCEPT ALL

NULLと重複行に対するEXCEPT ALL

本エントリはFirebird Advent Calendar 2018の16日目です。

NULLと重複行に対するINTERSECT, INTERSECT ALLは説明しました。
では、EXCEPT ALLはどうでしょうか?

これも「プログラマのためのSQL 第4版 34.2.2 NULLと重複行に対するINTERSECTとEXCEPT」という部分に以下の回答があります。これの先頭に六行CTEの定義をつければ、そのまま動作します。(前回のブログと同じ)

-- S1 EXCEPT ALL S2(Firebird with CTEバージョン)
WITH RECURSIVE Series AS
(
SELECT 1 AS seq from …

[さらに読む]
NULLと重複行に対するINTERSECT

NULLと重複行に対するINTERSECT

エントリはFirebird Advent Calendar 2018の14日目です。

前日のエントリでFirebird(とMySQLも)INTERSECTとEXCEPTは対応していないことと、NULLや重複行がない場合はググればでてくるようなクエリでだいたい大丈夫ということを述べました。

では、NULLや重複行が「ある」場合はどうでしょう?

一つの解は「プログラマのためのSQL 第四版 日本語版」の「34.2.2 NULLと重複行に対するINTERSECTとEXCEPT」に掲載されているイツァック・ベンガン(itzik ben-gan)によるものがあります。

-- 利用するテーブル
CREATE TABLE S1(a1 CHAR(1));
INSERT INTO S1 VALUES('a');

[さらに読む]
FirebirdでFLOATを使(う|わない)理由

FirebirdでFLOATを使(う|わない)理由

本エントリはFirebird Advent Calendar 2017の22日目です。

私の本業(=家のローン払いに一番貢献している収入)はMySQLなので、最近以下のエントリを読んでモヤっとしてました。

MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由(Qiita)

時間があったらコメントしないとなー、と思ってたら、すでに以下のエントリができてました。多謝。

MySQLのFLOAT型を使う理由が見つからない件(hnwの日記)

[さらに読む]
DISTINCT, COUNT, そしてNULL

本エントリはFirebird Advent Calendar 2017の14日目です。

DISTINCT, COUNT, そしてNULL

唐突ですが、次の文章のうち間違っているものは? SELECT文で。。。。

(1) 行数を数えるときにはCOUNT(*)
(2) 行数を数えるときにはCOUNT(カラム名)でも(1)と同じ
(3) カラムのユニークな行数を数えるときはCOUNT(DISTINCT カラム名)
(4) 複数カラムのユニークな行数を数えるときはCOUNT(DISTINCT カラム名1, カラム名2)

じゃ確認してみましょう。

create table t1(i1 int, i2 int);
insert into t1 values(1,1);
insert into t1 values(1,2);
insert into t1 values(2,3);
select count(*) from t1;

COUNT
=====================
3

[さらに読む]
Firebird CTEでFizzBuzz

Firebird CTEでFizzBuzz

本エントリはFirebird Advent Calendar 2017の13日目です。

DEKOさんが以下のエントリを書いていたので、それのCTE(Common Table Expression)版を作ってみました。

Firebird SQL のストアドプロシージャで FizzBuzz(FizzBuzz Advent Calendar 2017)

WITH RECURSIVE my_cte AS
(
SELECT 1 AS i from rdb$database
UNION ALL
SELECT 1+i FROM my_cte WHERE i )
SELECT CASE
WHEN (mod(i,3)=0) AND (mod(i,5)=0) THEN 'Fizz Buzz'
WHEN mod(i,3)=0 THEN 'Fizz'
WHEN mod(i,5)=0 THEN 'Buzz'
ELSE i END
FROM my_cte;

実行するとこんな感じ。

CASE
==========
1 …

[さらに読む]
Firebirdでデータの歯抜けを探す(NULLあり、の続き)

Firebirdでデータの歯抜けを探す(NULLあり、の続き)

本件はFirebird Advent Calendar 2017の11日目です。

一昨日のブログ書いてから気づいたんですが、以下の条件に加えてもうひとつ条件がありました。

条件1: seqは整数
条件2: seqは1からはじまり、1ずつ増えていく連番
条件3: seqはNULLではない。
条件4: (seq+1)はオーバーフローしない
条件5: seqは重複しない

つまり、seqをINTEGERで宣言すると条件1を満たし、さらにUNIQUE制約をつけると条件5、
さらにPRIMARY KEYにすれば条件条件3, ダメ押しでMySQLでいう「AUTO_INCREMENT」的な

[さらに読む]
Firebirdの分析関数の衝撃(1)row_numberでデータの歯抜けを探す

MySQLも8.0からWindow関数が実装され、これでオープンソースRDBMS御三家すべてでWindow関数が利用できるようになります。(PostgreSQLは8.4から、Firebirdは3.0から実装済み)

今後は各種SQL本でも、Window関数が普通に掲載され、普通に利用されてくると思いますので、
ここではミックさんや山岸さんが扱わない(たぶん)Firebirdでの利用について、検証・紹介しておきます。

1.データの歯抜けを探す(Window関数を使わない方法)

データの歯抜けを探す方法はミックさんの「HAVING句の力(CodeZine)」記事にて説明されています。

FirebirdでもWindow関数を持たない3.0より前のバージョンでは、この方法が使えます。以下のテーブルを

[さらに読む]
使い慣れたSQLに潜む実装依存: Firebirdの場合(12) UPDATE文による主キーの入れ替え

本エントリはFirebird Adventcalendar 2016の17日目です。

使い慣れたSQLに潜む実装依存:3.構文とトランザクション UPDATE文による主キーの入れ替え

まぁMySQLと同じでだめな感じですorz 素朴な実装なので。。。。

SQL&gt create table table1(c1 int primary key);
SQL&gt insert into table1 values(1);
SQL&gt insert into table1 values(2);
SQL&gt update table1 set c1 = case c1 when 1 then 2 when 2 then 1 end;
Statement failed, SQLSTATE = 23000
violation of PRIMARY or UNIQUE KEY constraint "INTEG_15" on table "TABLE1"
-Problematic key value is ("C1" = 2)

[さらに読む]
37 件中 1 - 10 件を表示
次の 10 件 »