Oracle

スラィリー

Oracle文字列のサイズを取得する方法


Oracle(10g)で、文字数(バイト数)毎のレコード数を取得するクエリに関するメモ。

前提:会員ユーザは、会員登録時に会員ID(必須:半角6文字~15文字までの半角英数)を
登録する仕組みになっている。

やりたいこと:会員IDが、どの文字数でどれくらい登録されているのか、を文字数の昇順で出力したい。※結果によっては、6~15文字の仕様変更を検討したい、とか。

※テーブル名:carp_fanclub
※会員IDカラム名:kaiin_id

SELECT
  length(kaiin_id) as 文字数,
  count(*) as レコード数
FROM
  carp_fanclub
GROUP BY
  length(kaiin_id)
ORDER BY
  length(kaiin_id) asc

※文字数ではなく、バイト数毎に出力したい場合は、”length“を”lengthb“に変えればおk。

がんばれ広島カープ!
目指せクライマックス!!

スライリー

Oracle日付別カウント数集計


※2011/10/5 追記:Mototakerさんのご指摘により、一部修正を行いました。

Oracle(10g)での日付別集計の取得クエリに関するメモ。

前提:マツダスタジアムは、入場時に日付(date型)を時:分:秒までOracleに保存している。
欲しいデータ:2011年6月の入場者数を日別に抽出したい。

※テーブル名:zoom_zoom
※入場日付カラム名:enter_dt

SELECT

enter_dt as 入場日付,

count(enter_dt) as 入場者数

FROM

zoom_zoom

WHERE

enter_dt between to_date(’2011/06/01′,’yyyy/mm/dd’) AND

to_date(’2011/06/30′,’yyyy/mm/dd’)

GROUP BY

enter_dt

ORDER BY

enter_dt asc;

とすると、時:分:秒ごとにグルーピングされてしまい、日別にならない(T△T)

入場日付 |入場者数
—————————-+————-
2011/06/01 10:56:24 | 1
2011/06/01 11:12:12 | 1
2011/06/01 11:23:38 | 1
2011/06/01 11:38:32 | 1


なので、to_date関数を使ってenter_dtを日付変換することで、日別のカウントを取得。

SELECT

trunc(enter_dt) as 入場日付,

count(trunc(enter_dt)) as 入場者数

FROM

zoom_zoom

WHERE

enter_dt between to_date(’2011/06/01 00:00:00′,’yyyy/mm/dd hh24:mi:ss’) AND

to_date(’2011/06/30 23:59:59′,’yyyy/mm/dd hh24:mi:ss’)

GROUP BY

trunc(enter_dt)

ORDER BY

trunc(enter_dt) asc;

こうすると、日別の入場者数が取得可能にo(*^▽^*)o

入場日付 |入場者数
——————-+————-
2011/06/01 | 30,498
2011/06/02 | 32,129
2011/06/03 | 31,949
2011/06/04 | 32,134


がんばれ広島カープ!
マツダスタジアム行きたい!!

Oracle改行コードを含むレコード検索


Oracle(10g)「改行コードを含むレコードを検索する」クエリーの覚書き。

CHR関数を使って、指定カラムに改行コードを含むレコードを抽出。

select * from テーブル名 where カラム名 like ‘%’ || chr(13) || ‘%’;

ちなみに、多くの開発言語では改行をあらわす記号 ‘\r’ や ‘\n’ などがあるが、SQL や PL/SQL にはないとのこと。

始めは、

select * from テーブル名 where regexp_like (カラム名,’\n’)

とかやってみたけど、ダメでした(-_-)zzz