これは2019/05/15現在の備忘録であり、今後機能の改廃によって記述内容と一致しなくなる可能性があります(2021/01/22更新)。
SQL クエリの使用を開始する / Getting started with SQL queries
https://docs.microsoft.com/azure/cosmos-db/sql-query-getting-started
このエントリで使うデータ
国内の空港のIATAコードや日本語および英語での略称を保持するようなデータベース(Domestic)を使います。具体的には、以下のようなデータが格納されています。idとしてIATAコードを使っています。
[ .... { "id": "KMI", "ja": "宮崎", "en": "Miyazaki" }, { "id": "FUJ", "ja": "五島福江", "en": "Goto Fukue" }, { "id": "IKI", "ja": "壱岐", "en": "Iki" }, { "id": "TSJ", "ja": "対馬", "en": "Tsushima" }, { "id": "NGS", "ja": "長崎", "en": "Nagasaki" }, { "id": "KMJ", "ja": "熊本", "en": "Kumamoto" }, { "id": "OIT", "ja": "大分", "en": "Oita" }, { "id": "HSG", "ja": "佐賀", "en": "Saga" }, { "id": "KKJ", "ja": "北九州", "en": "Kitakyushu" }, { "id": "FUK", "ja": "福岡", "en": "Fukuoka" }, { "id": "KCZ", "ja": "高知", "en": "Kochi" }, { "id": "MYJ", "ja": "松山", "en": "Matsuyama" }, { "id": "TKS", "ja": "徳島", "en": "Tokushima" }, .... ]
全件検索
これは単純にselect * from Airportsでよいですが、Cosmos DB内部で使う要素まで取得してしまうので、取得したい要素を明示したほうがよいです。また、要素はCase Sensitiveなので注意が必要です。
SELECT D.id, D.ja, D.en from Domestic D
[ .... { "id": "KMI", "ja": "宮崎", "en": "Miyazaki" }, { "id": "FUJ", "ja": "五島福江", "en": "Goto Fukue" }, { "id": "IKI", "ja": "壱岐", "en": "Iki" }, { "id": "TSJ", "ja": "対馬", "en": "Tsushima" }, { "id": "NGS", "ja": "長崎", "en": "Nagasaki" }, { "id": "KMJ", "ja": "熊本", "en": "Kumamoto" }, { "id": "OIT", "ja": "大分", "en": "Oita" }, { "id": "HSG", "ja": "佐賀", "en": "Saga" }, { "id": "KKJ", "ja": "北九州", "en": "Kitakyushu" }, { "id": "FUK", "ja": "福岡", "en": "Fukuoka" }, { "id": "KCZ", "ja": "高知", "en": "Kochi" }, { "id": "MYJ", "ja": "松山", "en": "Matsuyama" }, { "id": "TKS", "ja": "徳島", "en": "Tokushima" }, .... ]
条件指定(完全一致)
where xxx=yyy です。
SELECT D.id, D.ja, D.en from Domestic D where D.id = 'HND'
[ { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" } ]
部分一致 (like, contains)
2021/01/20の時点で、LIKEキーワードが追加されています。
Introducing the LIKE keyword in Azure Cosmos DB
https://devblogs.microsoft.com/cosmosdb/like-keyword-cosmosdb/
これまで、包含や部分一致ではANSI SQLのような書き方はできませんでしたが、LIKEキーワードが追加されたことで、ようやく可能になりました。LIKEでは以下のワイルドカードが利用できます。
ワイルドカード | 説明 |
---|---|
% | ゼロ個以上の任意の文字 |
_ (アンダースコア) | 任意の1個の文字(他のデータベースで言えば?に相当) |
[ ] | 指定された範囲([a-f]) もしくはセット ([abcdef]) に入っている1個の任意の文字 |
[^] | 指定された範囲([^a-f]) もしくはセット ([^abcdef]) に入っていない1個の任意の文字。 ^を否定と考えると理解しやすいかも。 |
LIKE
https://docs.microsoft.com/azure/cosmos-db/sql-query-keywords#like
SELECT D.id, D.ja, D.en from Domestic D where D.id like '%D%'
[ { "id": "HKD", "ja": "函館", "en": "Hakodate" }, { "id": "DNA", "ja": "嘉手納", "en": "Kadena" }, { "id": "OKD", "ja": "札幌(丘珠)", "en": "Sapporo (Okadama)" }, { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" }, { "id": "SDJ", "ja": "仙台", "en": "Sendai" } ]
もちろんこれまでの where contains( xxx, yyy ) も使えます。
CONTAINS (Azure Cosmos DB)
https://docs.microsoft.com/azure/cosmos-db/sql-query-contains
SELECT D.id, D.ja, D.en from Domestic D where contains( D.id, 'D')
[ { "id": "HKD", "ja": "函館", "en": "Hakodate" }, { "id": "DNA", "ja": "嘉手納", "en": "Kadena" }, { "id": "OKD", "ja": "札幌(丘珠)", "en": "Sapporo (Okadama)" }, { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" }, { "id": "SDJ", "ja": "仙台", "en": "Sendai" } ]
前方一致 (startwith)
where xxx like ‘yyy%’ もしくは where startswith( xxx, yyy ) です。
STARTSWITH (Azure Cosmos DB)
https://docs.microsoft.com/azure/cosmos-db/sql-query-startswith
SELECT D.id, D.ja, D.en from Domestic D where startswith( D.id, 'HN')
[ { "id": "HNA", "ja": "花巻", "en": "Hanamaki" }, { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" } ]
後方一致 (endswith)
where xxx like ‘%yyy’ もしくは where endswith( xxx, yyy ) です。
ENDSWITH (Azure Cosmos DB)
https://docs.microsoft.com/azure/cosmos-db/sql-query-endswith
SELECT D.id, D.ja, D.en from Domestic D where endswith( D.id, 'ND')
[ { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" } ]
文字列完全一致 (stringequals)
文字列の場合は、StringEqualsを使います。第3引数はtrueを明示的に指定しない限り、大文字小文字の区別を付けて検索します。大文字小文字の区別なしで検索をしたい場合にはtrueを指定してください。
STRINGEQUALS (Azure Cosmos DB)
https://docs.microsoft.com/azure/cosmos-db/sql-query-stringequals
SELECT D.id, D.ja, D.en from Domestic D where StringEquals( D.id, 'HND', true)
[ { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" } ]
範囲指定 (between)
文字列値や数値の範囲指定はANSI SQLと同様、betweenを使います。
BETWEEN
https://docs.microsoft.com/azure/cosmos-db/sql-query-keywords#between
SELECT D.id, D.ja, D.en from Domestic D where SUBSTRING(D.id, 0, 1) between 'A' and 'D'
[ { "id": "AOJ", "ja": "青森", "en": "Aomori" }, { "id": "DNA", "ja": "嘉手納", "en": "Kadena" }, { "id": "ASJ", "ja": "奄美", "en": "Amami" }, { "id": "AXT", "ja": "秋田", "en": "Akita" }, { "id": "AKJ", "ja": "旭川", "en": "Asahikawa" }, { "id": "CTS", "ja": "札幌(千歳)", "en": "Sapporo (Chitose)" } ]
候補の列挙 (IN)
1個以上の選択肢に合致するものを抽出する場合は、ANSI SQLと同じくINを使います。
IN
https://docs.microsoft.com/azure/cosmos-db/sql-query-keywords#in
SELECT D.id, D.ja, D.en from Domestic D where D.id in ('HND', 'NRT', 'KOJ')
[ { "id": "KOJ", "ja": "鹿児島", "en": "Kagoshima" }, { "id": "NRT", "ja": "東京(成田)", "en": "Tokyo (Narita)" }, { "id": "HND", "ja": "東京(羽田)", "en": "Tokyo (Haneda)" } ]