ことの発端はSQL

最近、いろいろと悩んでおります。

ことの発端は、SQLです。

僕はSQLの初心者で、つい最近まで以下のようなwhere句を書いていました。

where
列名1='aaa' or
列名1='bbb' or
列名1='ccc' or
...
列名1='fff'

なんかもっと楽に書けないかなぁと思っていました。
あるとき、Aさんが以下のように書くのを見ました。

where 列名1 in ('aaa', 'bbb', ...,'fff')

さっそく使ってみると、らくちんでうれしくなりました。

でもシングルクォーテーションでくくるのが面倒で、なんとかならんかと
思うようになりました。

aaa
bbb
ccc
...
fff

なんて書いて、マクロエディタとかで以下のようにできたらいいなぁと思いました。

'aaa',
'bbb',
'ccc',
...
'fff',

(つづく)

プログラムを書いたが..

マクロでできたらいいと思いつつ、perlでsplit,joinを使ってプログラムを書きました。
でも、データが以下のように提供されるケースでは

使いたいと思ってもコピペでコマンド引数にそのまま渡せないし、いちいちファイルに保存してから読み込ますのも面倒だし、なんか小回りがきかなくて面倒な感じになってました。
僕は、この問題に対してプログラミングで解決しようとしていたのです。

例えば、以下のサイトにあるぐるぐる系のような感じで問題解決をしようとしていたのだと思います。
http://www.atmarkit.co.jp/ait/articles/1208/22/news132.html

dual

話は変わりますが、oracleにdualという表があります。
今だに実体がつかめていません。


http://en.wikipedia.org/wiki/DUAL_table

SELECT 1+1
FROM DUAL;
 
SELECT SYSDATE 
FROM   DUAL;
 
SELECT USER 
FROM   DUAL;

初めて見たのは、日付を表示する例でした。(上から2つ目)

SQLはデータが格納されたテーブルから必要な情報を取り出すための言語だと思っていたので、何だろうこれはと思いました。

ちなみに、sqlplusでの実行結果はこんな感じになりました。

SQL> desc dual;
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------

 DUMMY                                              VARCHAR2(1)

SQL> select * from dual;

DU
--
X

SQL> select 1+1 from dual;

       1+1
----------
         2

SQL> select sysdate from dual;

SYSDATE
--------
12-10-21

SQL> select user from dual;

USER
------------------------------------------------------------
TEST

SQL>

(つづく)

dualがきっかけで

dualのことを調べていたときに、たまたま次のページだったと思うのですが、
http://www.shift-the-oracle.com/table/dual.html
SQLで文字列の生成を行っていて、なにこれ?SQLって文字列つくれるの?って意表をつかれました。だとしたら、SQLの検索に必要なデータをとってくる場合は、以下のように書けばいいんじゃないかって思いました。

select '''' || 列名 || ''',' from テーブル

↓実際にこんな感じで出力される
'aaa',
'bbb',
'ccc',
...
'fff',


それでExcelでも、concatenate関数を使って、文字列を連結しました。







ABC
aaa'aaa',
bbb'bbb',
ccc'ccc',
...'...',
fff'fff',

サブクエリ(subquery)

さきほどは、select '''' || 列名 || ''',' from テーブル で欲しい結果を得ましたが、
サブクエリを使うと以下のように書けます。

select * from テーブルX where 列名Y in
(select 列名Z from テーブルW)  --*1

∗1 このselect文が'aaa','bbb','ccc',...,'fff'を返すと仮定


参照したURL:
http://www.atmarkit.co.jp/ait/articles/1208/06/news118.html



また、update文でもサブクエリが使用できて以下のページのように書けるようです。
http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls875.htm



LISP?