ラベル データベース全般 の投稿を表示しています。 すべての投稿を表示
ラベル データベース全般 の投稿を表示しています。 すべての投稿を表示

2009年12月16日水曜日

XMLDB

久しぶりの技術DBネタ

Oracleの話ですが、単純に、通常のテーブルをSELECTした結果を
XMLで取る方法は、

select
 dbms_xmlgen.getxml(
 '対象のSELECT文'
 )
from dual

で取れますが、この方法だと、
データXML
と固定のタグで囲まれてしまいます。

で、ROWSET, ROWタグを変更しようと思ったら、
ちょっとストアドを組む必要があります。


declare
 qryCtx DBMS_XMLGEN.ctxHandle;
 result CLOB;

begin
 qryCtx := DBMS_XMLGEN.newContext('対象のSELECT文');

 -- これでROWSETタグを任意の文字に変更
 -- NULLを指定すると、タグがでない。
 DBMS_XMLGEN.SETROWSETTAG(qryCtx, '項目'); 
 -- これでROWタグを任意の文字に変更
 -- NULLを指定すると、タグがでない。
 DBMS_XMLGEN.setRowTag(qryCtx, NULL);   

 result := DBMS_XMLGEN.getXML(qryCtx);

 DBMS_OUTPUT.PUT_LINE(result); -- ここはちょっと無理やり表示した感が。
 DBMS_XMLGEN.closeContext(qryCtx);
end;
/

これで、<項目>データXML</項目>
になります。

2009年7月6日月曜日

Nullのソート順

久し振りにDBネタでも。

NULLを含む列でソートした場合、RDBMSによっては、
出力される順番が変わります。

Oracle: NULLは最後
sqlServer:NULLは最初

で、NULLの出力順序を変える方法
Oracle  :Order by カラム名 nulls first
sqlServer: Order by
       Case When カラム名 Is Null Then 0 Else 1 END desc,
       カラム名

2009年2月24日火曜日

COUNT(*)とCOUNT(カラム名)

サボっていた、勉強会ネタの続き

COUNT(*)とCOUNT(カラム名)
OTNの掲示板の古い投稿を読むと、
COUNT(*)するな、COUNT(カラム名)を使え!
という規約があったとかいう笑い話(?)が
ありましたが、行数を数えたいなら
COUNT(*)しましょう。
そもそもCOUNT(カラム名)とすると
カラム名のNULL以外のレコード数を
カウントしてくれます。
(結果からして違うー)

2009年2月19日木曜日

INとEXISTS

INとEXISTSは、一緒か?と時々聞かれます。
そんなときには、

・固定値を条件に使う場合は、IN
・サブクエリーを条件にする場合は、EXISTS

で使いわけましょうと答えます。
さらに、脅し文句(?)として、NOT INは、
条件にNULLが含まれると、絶対抽出されない事も。

  例) WHERE カラム名 NOT IN ( ‘A’, ‘B’, NULL )
または
     WHERE カラム名 NOT IN ( SELECT NULLを含む列 From … )

2009年2月13日金曜日

DISTINCTとGROUP BY

たまに、集計をしていないのにGROUP BYしている
SQLを見かけます。
そういうものを見る度に、DISTINCTを知らない
のかななんて思ってしまいます。
GROUP BYは、あくまで、集計する項目を
指定するための構文です。

重複行を除くのなら、DISTINCTを使いましょう。

2009年2月12日木曜日

RDBにおけるNULL

せっかくなので、勉強会で取り上げたネタを
書き込んでおきます。

第一弾は、RDBにおけるNULL

RDBは、プログラミング言語とは違い、
3値論理に基づいてNULLを扱います。
この3値論理上では、= NULLとした場合、
必ずunknownとなり、結果が得られません。
(C# とかやった後、思わずWhere 項目 != null
とかして、一瞬なんで出ないと思ってしまうのは私です。)

そのため、NULLを比較するための構文として
IS NULL, IS NOT NULLが存在します。

う~ん、ややこしいと思ったあなた。
3値論理でそんなこと言ってたらだめです。
関係モデル生みの親、コッドさんは、
さらに4値論理を提唱され、2種類のNULLを
扱おうとされていました。

2種類のNULL
未知     :サングラスの下の目の色とか
適応不能  :車の性別とか

分からなくはないのですが、実装されなくてよかった~。

続く。