SQLの仕様(旧)

概略

本スキンsm02ではSQL(っぽい)の構文を使ってプレイリスト作成とプレイリストの列指定ができます。
SQLについて非常に大雑把に説明すると、データベース操作を行う為のデータベース言語です。
Windows Media Player(以下、WMPと略)のライブラリはデータベースみたいなものなので、SQL構文でプレイリスト作成やデータ出力機能を作ってみました。
以降、SQLと記述した場合、断り書きがない限り、本スキンの独自SQLをさします。

SQLを知らない方にとっては、やや難解な機能かもしれません。
サンプルを試してもよくわからない場合、本機能は無視してもいいと思います。
既にSQLを知っている方は容易く習得できるはずですが、本スキンには独自仕様もあります。
特にwhere句には独自仕様が多いので注意してください。
他に独自仕様としてexpand句やoption句なんてものもあります。

一応ですが、本スキンの構文解析の精度が低い上に、WMPの制約や本スキンの仕様、不具合等により
「このSQL文は正しいはずなのにエラーになるぞ?」
「このSQL文おかしいけどエラーにならないぞ?」
「このSQL文の検索結果おかしくない?」
「エラーメッセージがわかりにくい!」
等の事は十分起こりえます。
ご了承ください。

 

SQLの構文と内容

select 列名[, 列名, ...]

    from テーブル名
        where 列名 [=<>等] 値 [[and|or] 列名 [=<>等]値 ...]
        order by 列名 [asc|desc] [,列名 [asc|desc] ...]
        option タイプ [値, ...]

または

select 列名[, 列名, ...]
    expand 再生リスト名[, 再生リスト名, ...]
        where 列名 [=<>等] 値 [[and|or] 列名 [=<>等]値 ...]
        order by 列名 [asc|desc] [,列名 [asc|desc] ...]
        option タイプ [値, ...]


◆「from テーブル名」部分
ライブラリ登録されているファイルの取得元テーブルを指定します。
指定できるテーブルは以下の通りです
audio:音楽ファイル
video:動画ファイル
photo:画像ファイル
playlist:プレイリスト
other:その他(MIDI等)
※from句とexpand句は併用できません。
※expand句と異なり、テーブルは1つのみ設定可能です。

// 音楽ファイルを取得
select name from audio


◆「expand 再生リスト名」部分
ライブラリ登録されている再生リスト、再生中のプレイリスト、ブックマーク等を取得元に指定します。
指定できるパターンは以下の通りです。
・登録済の再生リスト名  (''で囲ってください)
・all          (固定値:登録済の全ての再生リスト)
・random       (固定値:登録済の再生リストからランダム)
・current      (固定値:現在再生中のプレイリスト)
・playlistview (固定値:SQL検索画面のプレイリストビューに設定されたプレイリスト)
・bookmark1~20(固定値:ブックマーク1~ブックマーク20を含むプレイリスト)
・stackboard   (固定値:スタックボード)
※from句とexpand句は併用できません。
※同じファイルが複数個所に登録されている場合、マージされ1つになります。

// 「BestMusic」という再生リストからデータを取得
select name expand 'BestMusic'

// 「My List」という再生リストを
select name expand 'My List'

// 「GoodSong」「BetterSong」という再生リストからデータを取得
select name expand 'GoodSong', 'BetterSong'

// 「洋楽」から始まる再生リストからデータを取得
select name expand '洋楽%'

// 「2014」を含む再生リストからデータを取得
select name expand '%2014%'

// 全ての再生リストからデータを取得
select name expand all

//ランダムな 再生リストからデータを取得
select name expand random

// 再生中のプレイリストからデータを取得
select name expand current

// SQL検索画面のプレイリストビューに設定されたのプレイリストリストからデータを取得
select name expand playlistview

// 1番目のブックマークを含むプレイリストからデータを取得
select name expand bookmark1

// 15番目のブックマークを含むプレイリストからデータを取得
select name expand bookmark15

// スタックボードからデータを取得
select name expand stackboard


◆「select 列名,[, 列名, ...]」部分
プレイリストに表示する列です。
ファイル出力の場合は出力する列です。
列名は","区切りで複数登録できます。

// 全ての音楽ファイルを取得し、name, length列を表示
select name, length from audio

列名の代わりに"*"を指定できます。
"*"を指定した場合は、テーブル毎に組み込んだ列を表示します。
(※一般的なSQLでは指定テーブルの全列を表示しますが、本SQLは異なります)

// * を使う
select * from audio

また列にconvert関数が利用できます。※詳細は後述の「convert関数について」を参照してください

またas句を使うと列に別名を設定できます。
別名内にスペース( )やカンマ(,)を使う場合は別名を''で囲ってください。

// name, lengthに別名を付ける
select name as タイトル, length as 時間 from audio
// name, lengthに別名を付ける(スペースやカンマを使う)
select name as 'なまえ,です', length as 'さいせい 時間', rating as '☆は''あなたの評価''です' from audio


◆「order by 列名 [asc|desc] [,列名 [asc|desc] ...]」部分
取得レコードのソート条件を指定します。
省略が可能です。
省略した場合はソートされません。
列名の後ろにascを指定すれば昇順、descを指定すれば降順にソートされます。
asc|descが未設定の場合は昇順にソートされます。
カンマ記号","で列を区切れば複数のソート条件が設定できます。

// nameを昇順でソート
order by name
order by name asc

// nameを降順でソート
order by name desc

// albumを昇順でソート、nameを降順でソート
order by album asc, name desc

特殊なソートとして[order by shuffle]または[order by random]、[order by reverse]があります。
[order by shuffle]または[order by random]を使うとランダムなソートを行います。
[order by reverse]を使うとソート結果を逆順にします。
randomとshuffleの違いによる機能の違いはありません。

// シャッフル(ランダム)ソート
order by shuffle
order by random

// 逆順に並べ替える
order by reverse

 

◆「where 列名 [=<>等] 値 [[and|or] 列名 [=<>等]値 ...]」部分
取得レコードの絞り込み条件を指定します。
where句は省略が可能です。
省略した場合、対象テーブルの全レコードが取得されます。
「name = 'hoge'」や「playcount > 10」のように条件を指定します。

「列名 演算子(=等) 値」の比較のみ対応しており、「値 = 列名」や
「列名1 = 列名2」のような比較はできません。


列ごとにデータ型と範囲を持っています。
データ型にはnumber(数値),string(文字列),date(日時),boolean(真偽)があります。
文字列型は「列名='値'」のように値を''で囲んでください。
日付型は「列名='2001/10/01'」や「列名='2001/10/01 22:00:00'」のように
値を''で囲み、かつ'yyyy/mm/dd'または'yyyy/mm/dd 24hh:mm:ss'形式で
記述してください。
真偽型は「列名=true」または「列名=false」のように記述してください。

データ型によって利用できる比較演算子が異なります。
数値(=,<>,<=,<.>=.>)
文字列(=,<>,like,notlike)
日付(=,<>,<=,<.>=.>)
真偽(=,<>)
このほかに(is,isnot)が全てのデータ型で利用できます。
(is,isnot)は後述のnullで説明します。

// nameがhoge
where name='hoge'

// playcountが10でない
where playcount<>10

// releasedateが'2010/01/01 13:00:00'以上
where releasedate>='2010/01/01 13:00:00'

// releasedateが'2010/01/01 00:00:00'より大きい
where releasedate>'2010/01/01'

// nameが'い'から始まる。
where name like 'い%'

// nameが'い'から始まらない
where name notlike 'い%'

// urlに'rock'が含まれている
where url like '%rock%'

特別な比較値としてnullがあります。
この値は"データが存在しない"事を表しています。
全てのデータ型で利用できますが、指定可能な比較演算子isまたはisnotだけです。

// データが未設定のreleasedateだけ取得
where releasedate is null

// データが設定されているartistだけ取得
where artist isnot null

なお文字列の場合は「column = ''」と「column is null」は同じ結果になります。

// 2つは同じ結果となる。
where album is null
where album = ''

where album isnot null
where album <> ''

複数の条件を設定する場合はandまたはorを使います。
論理演算子はand > orの優先順位です。
3つ以上の条件を設定する場合は優先順位に気を付けてください。
本スキンでは()が未対応です。

// playcountが10以上かつplaycountが20未満のレコードを検索
where playcount >= 10 and playcount < 20

// playcountが30以上またはratingが99のレコードを取得
where playcount >= 30 or rating = 99

// 「playcountが30以上」または「ratingが99かつnameが'あ'で始まる」レコードを取得
where playcount >= 30 or rating = 99 and name like 'あ%'

// 「ratingが0より大きく50以下かつnameが'b'で始まる」または「ratingが99かつnameが'a'で始まる」
// レコードを取得
where rating > 0 and rating <= 50 and name like 'b%' or rating = 99 and name like 'a%'


◆「option [totallength|top | limit | randomselectfrom | expandplaylist] [値, ...]」部分
取得レコードに対するオプション操作を指定します。
省略が可能です。

・totallength
先頭レコードから合計再生時間[秒]指定による取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して
絞り込みを行います。

// 取得レコードの合計再生時間を1時間(3600秒)以下に絞り込みます。
option totallength 3600
option totallength toMinute(60)
option totallength toHour(1)

・top
先頭レコードから件数指定による取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して
絞り込みを行います。

// 先頭レコードから20件取得します。
option top 20

・limit
先頭レコードから位置指定[0始まり]、件数指定のによる取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して
絞り込みを行います。

// 3件目のレコードから10件取得します。
option limit 2, 10            ※3, 10ではありません! "0,1,2"で3件目のレコード

・randomselectfrom 列名
指定列名のランダムな値を使った取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して
絞り込みを行います。
※後述のRandomValue()の説明も別途参照してください。

// album列に存在するランダムな値を基に、取得レコードを絞り込む
option randomselectfrom album

// artist列に存在するランダムな値を基に、取得レコードを絞り込む
option randomselectfrom artist

・expandplaylist
from playlistを指定したとき限定。
selectを実行すると通常はメディアファイルが取得されますが、
from playlistの場合は、プレイリストを頂点とするツリー構造にメディアファイルが
配置されています。
このプレイリストを通常のselectと同じようにフラットな状態に展開します

// from playlistで全てのプレイストを取得し、取得したプレイリストを展開します。
select * from playlist option expandplaylist

// from playlistで全てのプレイストを取得(option expandplaylistを使わない場合)
// ※↑のSQLと実行結果を比較してみてください。
select * from playlist

 

-------------------------------------
レコードの抽出条件の注意点や制約
-------------------------------------
<条件式の記述順>
[列名][比較演算子][値]の順で記述してください。
一般的なSQLでは、[値][比較演算子][列名]や[列名][比較演算子][列名]
などの可能ですが、本スキンは未対応です。

○where name = 'aaa'
×where 'aaa' = name
×where name = album

<複数条件設定について>
現機能では()に未対応です。
論理演算子はand > orの優先順位です。
○where name='aaa'
○where name='aaa' and playcount>10
○where name='aaa' or name='bbb'
○where name='aaa' or name='bbb' and playcount>10
×where (name='aaa' or name='bbb') and playcount>10 // ()に未対応

<null比較>
一般的なSQLではnullでない場合、[is not]と記述しますが
本SQLでは[isnot]と記述します。
○where name isnot null
×where name is not null

<文字列>
文字列データの比較で'を値に含めたいときは''と記述してください。
○where name = 'I''m a student.'
×where name = 'I'm a student.'

検索時に大文字・小文字の区別はしません
name = 'you'
name = 'You'
name = 'YOU'
上記の検索結果の場合、大文字・小文字関係なくyouというnameを検索します。
なお文字列のデータ比較の詳細は後述しています。

後方一致(name like '%xyz')はサポートしていません。

一般的なSQLでは部分一致しない場合、[not like]と記述しますが、
本SQLでは[notlike]と記述します。
○name notlike 'あ%'
×name not like 'あ%'

 

WHERE句利用時の補足

length 秒単位
// 10秒以上
length >= 10
// 2分以上
length >= 120
length >= toMinute(2)
// 1時間以上
length >= 3600
length >= toHour(1)
※to~関数についての詳細は、後述の「to~関数について」を参照してください

freamrate fps単位
// 20fps以上
freamrate >= 20

filesize バイト単位
// 1KB以上
filesize >= 1024
filesize >= toKB(1)
// 1MB以上(1024*1024 = 1048576 byte)
filesize >= 1048576
filesize >= toMB(1)
// 1GB以上(1024*1024*1024 = 1073741824 byte)
filesize >= 1073741824
filesize >= toGB(1)
※to~関数についての詳細は、後述の「to~関数について」を参照してください

rating 特殊設定(ratingautoも()内の数値以外は同じ)
☆0   0(0)
☆1   1-12(1)
☆2   13-37(25)
☆3   38-62(50)
☆4   63-86(75)
☆5   87-99(99)
// ☆2つを指定(確実に取得したい場合)
rating >= 13 and rating <= 37
// ☆2つを指定(ratingの場合データ不整合なければこちらでもOK。ratingautoの場合は70などの場合もある)
rating = 25
// toStar関数で☆4以上を指定
rating >= toStar(4)
※to~関数についての詳細は、後述の「to~関数について」を参照してください

日付型(lastplayeddate, adddateなど)
// 日付指定
lastplayeddate >= '2011/01/01'
// 日時指定
lastplayeddate >= '2011/01/01 15:01:09'
// today系関数で指定 ※詳細は後述の「today系関数について」を参照してください
lastplayeddate >= TodayFirst()

現在再生中のメディアの該当する属性値を利用する
// 現在再生中のメディアのアーティストの属性値を指定
artist = CurrentValue()
// 現在再生中のメディアの再生時間よりも長い曲を指定
length >= CurrentValue()

ランダムな値を利用する
// artistにランダムな値を設定する
artist = RandomValue()

四則演算・()・in・between・not・サブクエリ・count(*)・max()・group by等について

未対応です。

 

データ比較について(where句)

データ比較は「大文字・小文字は区別しない」「全角・半角は区別する」
「ひらがな、カタカナは区別する」という仕様になっています。
order by句(後述)とデータ比較方法が異なるので注意してください。
※where句は、MS提供コンポーネント(Queryオブジェクト)を使って
データ取得を行っている為、MS仕様に準じています。
※Windows8-WMP12で確認した結果なので例えばWMP11では異なる仕様
となるかもしれません。

// 上と下は同じ結果になる
where name = 'abcd'
where name = 'ABcD'

// 上と下は別の結果になる
where name = 'Aあ'
where name = 'Aア'

 

ソート順について(order by句)

ソート条件は以下のようになっています。

  • 数値型データは数値として判定
  • 真偽型データは文字として判定
  • 日付型データは1970年からの経過時間を基に判定
  • 文字列型データはエクスプローラに近いソート
    • ・大文字・小文字を区別しない
    • ・全角・半角を区別しない
    • ・ひらがな、カタカナを区別しない
    • ・ハイフン(-)は無視。
    • ・文字列内の数値は数値として扱う。
    • ・SJISコードでソート。
    • ・etc.

where句(前述)とデータ比較方法が異なるので注意してください。

//audioのname列(文字列)に下のようなレコードがある時に...
AbcdE
bgm10
ABCD
BGM01
bgm2
あまい
abefg
かたち
イス
王国
影(音読み:エイ、訓読み:かげ)

// nameを昇順ソート検索を行うと...
select name from audio order by name asc

//こんな感じにソートされます。
ABCD
AbcdE
abefg
BGM01
bgm2
bgm10
あまい
イス
かたち
影(音読み:エイ、訓読み:かげ)
王国

 

その他の制約

 

  • WMP11以降に提供されている組込み関数を内部で使用している為、WMP11以降でなければ動作しません。※本スキンはWMP11以降にのみ対応しています。
    ※Windows8-WMP12でのみ動作確認
  • OSとWMPとの組合せによって使用不可の列があるようです。
  • selectの列数が多い場合、プレイリスト表示で指定した列の一部が表示されない可能性があります。(WMPの仕様?)
  • 初めての検索時や全件出力等の重たい処理により数分間、WMP固まる事があります。
  • 歌詞・コメントなど幾つかの列はWMPの組込み関数内でwhere句の処理ができない為、スキン側で代替処理を行っています。これら列のwhere句による条件指定は、他の列と比べて著しく処理が遅くなる場合があります。
  • 結果タブへ検索結果を出力する場合はプレイリスト出力に比べて更に処理が重くなります。取得レコード件数や表示列数が多い場合は、非常に時間がかかります。特に「タブ区切り」の場合、WMPが数分~数十分固まる程、処理時間がかかります。
  • expand句による再生リスト指定は非常に重くなることがあります。
  • 実行履歴は本スキンの終了またはWindows Media Playerの終了により消去されます。
  • システム的な制約があるため、実行したSQLを保存する機能は作らない事にしました。SQL文を残したい場合、メモ帳などを使い手動でバックアップを取ってください。

 

最終更新:2014年11月10日 16:17