ClickHouse/docs/ja/sql-reference/functions/url-functions.md
2024-11-18 11:58:58 +09:00

37 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/sql-reference/functions/url-functions 200 URLs

URLを扱う関数

:::note このセクションで言及している関数は、最大のパフォーマンスのために最適化されており、ほとんどの場合、RFC-3986標準に従いません。RFC-3986を実装している関数には、関数名の末尾にRFCが付いており、一般的に動作は遅くなります。 :::

一般に、ユーザー文字列や@記号を含まない公的に登録されたドメインを扱う場合、RFCでない関数の変種を使用できます。以下の表は、各RFCおよび非RFC変種によってURL内のどのシンボルを解析できる)か、またはできない()かを示しています:

記号 RFC RFC
' '
\t
<
>
% ✔*
{
}
|
\\
^
~ ✔*
[
]
; ✔*
= ✔*
& ✔*

*が付いているシンボルは、RFC 3986におけるサブデリミタであり、@記号に続くユーザー情報に許可されています。

URLの一部を抽出する関数

URLに関連する部分が存在しない場合、空の文字列が返されます。

protocol

URLからプロトコルを抽出します。

一般的に返される値の例: http, https, ftp, mailto, tel, magnet。

domain

URLからホスト名を抽出します。

構文

domain(url)

引数

プロトコルをつけてもつけなくても指定できます。例:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

これらの例に対して、domain関数は以下の結果を返します:

some.svn-hosting.com
some.svn-hosting.com
clickhouse.com

返される値

  • 入力文字列がURLとして解析できる場合はホスト名、そうでない場合は空の文字列。 String

SELECT domain('svn+ssh://some.svn-hosting.com:80/repo/trunk');
┌─domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')─┐
│ some.svn-hosting.com                                   │
└────────────────────────────────────────────────────────┘

domainRFC

URLからホスト名を抽出します。domainと似ていますが、RFC 3986に準拠しています。

構文

domainRFC(url)

引数

返される値

  • 入力文字列がURLとして解析できる場合はホスト名、そうでない場合は空の文字列。 String

SELECT
    domain('http://user:password@example.com:8080/path?query=value#fragment'),
    domainRFC('http://user:password@example.com:8080/path?query=value#fragment');
┌─domain('http://user:password@example.com:8080/path?query=value#fragment')─┬─domainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐
│                                                                           │ example.com                                                                  │
└───────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────┘

domainWithoutWWW

先頭のwww.を除いたドメインを返します。

構文

domainWithoutWWW(url)

引数

返される値

  • 入力文字列がURLとして解析できる場合はドメイン名先頭のwww.を除く)、そうでない場合は空の文字列。 String

SELECT domainWithoutWWW('http://paul@www.example.com:80/');
┌─domainWithoutWWW('http://paul@www.example.com:80/')─┐
│ example.com                                         │
└─────────────────────────────────────────────────────┘

domainWithoutWWWRFC

先頭のwww.を除いたドメインを返します。domainWithoutWWWと似ていますが、RFC 3986に準拠しています。

構文

domainWithoutWWWRFC(url)

引数

返される値

  • 入力文字列がURLとして解析できる場合はドメイン名先頭のwww.を除く)、そうでない場合は空の文字列。 String

クエリ:

SELECT
    domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment'),
    domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment');

結果:

┌─domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment')─┬─domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment')─┐
│                                                                                         │ example.com                                                                                │
└─────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘

topLevelDomain

URLからトップレベルドメインを抽出します。

topLevelDomain(url)

引数

:::note プロトコルをつけてもつけなくても指定できます。例:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

:::

返される値

  • 入力文字列がURLとして解析できる場合はドメイン名。そうでない場合は空の文字列。 String

クエリ:

SELECT topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk');

結果:

┌─topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')─┐
│ com                                                                │
└────────────────────────────────────────────────────────────────────┘

topLevelDomainRFC

URLからトップレベルドメインを抽出します。topLevelDomainと似ていますが、RFC 3986に準拠しています。

topLevelDomainRFC(url)

引数

:::note プロトコルをつけてもつけなくても指定できます。例:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

:::

返される値

  • 入力文字列がURLとして解析できる場合はドメイン名。そうでない場合は空の文字列。 String

クエリ:

SELECT topLevelDomain('http://foo:foo%41bar@foo.com'), topLevelDomainRFC('http://foo:foo%41bar@foo.com');

結果:

┌─topLevelDomain('http://foo:foo%41bar@foo.com')─┬─topLevelDomainRFC('http://foo:foo%41bar@foo.com')─┐
│                                                │ com                                               │
└────────────────────────────────────────────────┴───────────────────────────────────────────────────┘

firstSignificantSubdomain

「最初の重要なサブドメイン」を返します。 「最初の重要なサブドメイン」は、comnetorg、またはcoの場合は第二レベルドメイン、その他の場合は第三レベルドメインです。 例えば、firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse'、firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'。 「重要でない」第二レベルドメインやその他の実装の詳細は将来変更されることがあります。

構文

firstSignificantSubdomain(url)

引数

返される値

  • 最初の重要なサブドメイン。 String

クエリ:

SELECT firstSignificantSubdomain('http://www.example.com/a/b/c?a=b')

結果:

┌─firstSignificantSubdomain('http://www.example.com/a/b/c?a=b')─┐
│ example                                                       │
└───────────────────────────────────────────────────────────────┘

firstSignificantSubdomainRFC

「最初の重要なサブドメイン」を返します。 「最初の重要なサブドメイン」は、comnetorg、またはcoの場合は第二レベルドメイン、その他の場合は第三レベルドメインです。 例えば、firstSignificantSubdomain (https://news.clickhouse.com/) = clickhouse, firstSignificantSubdomain (https://news.clickhouse.com.tr/) = clickhouse。 「重要でない」第二レベルドメインやその他の実装の詳細は将来変更されることがあります。 firstSignficantSubdomainに似ていますが、RFC 1034に準拠しています。

構文

firstSignificantSubdomainRFC(url)

引数

返される値

  • 最初の重要なサブドメイン。 String

クエリ:

SELECT
    firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment'),
    firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment');

結果:

┌─firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment')─┬─firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐
│                                                                                              │ example                                                                                         │
└──────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomain

「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返します。

構文

cutToFirstSignificantSubdomain(url)

引数

返される値

  • 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し、それ以外の場合は空の文字列を返します。 String

クエリ:

SELECT
    cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/'),
    cutToFirstSignificantSubdomain('www.tr'),
    cutToFirstSignificantSubdomain('tr');

結果:

┌─cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomain('www.tr')─┬─cutToFirstSignificantSubdomain('tr')─┐
│ clickhouse.com.tr                                                 │ tr                                       │                                      │
└───────────────────────────────────────────────────────────────────┴──────────────────────────────────────────┴──────────────────────────────────────┘

cutToFirstSignificantSubdomainRFC

「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返します。 cutToFirstSignificantSubdomainに似ていますが、RFC 3986に準拠しています。

構文

cutToFirstSignificantSubdomainRFC(url)

引数

返される値

  • 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し、それ以外の場合は空の文字列を返します。 String

クエリ:

SELECT
    cutToFirstSignificantSubdomain('http://user:password@example.com:8080'),
    cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080');

結果:

┌─cutToFirstSignificantSubdomain('http://user:password@example.com:8080')─┬─cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080')─┐
│                                                                         │ example.com                                                                │
└─────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomainWithWWW

「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返し、wwwは削除しません。

構文

cutToFirstSignificantSubdomainWithWWW(url)

引数

返される値

  • 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し(wwwを含む)、それ以外の場合は空の文字列を返します。 String

クエリ:

SELECT
    cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/'),
    cutToFirstSignificantSubdomainWithWWW('www.tr'),
    cutToFirstSignificantSubdomainWithWWW('tr');

結果:

┌─cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomainWithWWW('www.tr')─┬─cutToFirstSignificantSubdomainWithWWW('tr')─┐
│ clickhouse.com.tr                                                        │ www.tr                                          │                                             │
└──────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────┴─────────────────────────────────────────────┘

cutToFirstSignificantSubdomainWithWWWRFC

「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返し、wwwは削除しません。 cutToFirstSignificantSubdomainWithWWWに似ていますが、RFC 3986に準拠しています。

構文

cutToFirstSignificantSubdomainWithWWW(url)

引数

返される値

  • 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し("www"を含む)、それ以外の場合は空の文字列を返します。 String

クエリ:

SELECT
    cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy'),
    cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy');

結果:

┌─cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┬─cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┐
│                                                                                       │ mail.ru                                                                                  │
└───────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomainCustom

最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返します。 カスタムのTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。

設定例

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

構文

cutToFirstSignificantSubdomain(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部。 String

クエリ:

SELECT cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');

結果:

┌─cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐
│ foo.there-is-no-such-domain                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────┘

関連項目

cutToFirstSignificantSubdomainCustomRFC

最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返します。 カスタムTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 cutToFirstSignificantSubdomainCustomに似ていますが、RFC 3986に準拠しています。

構文

cutToFirstSignificantSubdomainRFC(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部。 String

関連項目

cutToFirstSignificantSubdomainCustomWithWWW

最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返し、wwwは削除しません。 カスタムのTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。

設定例

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

構文

cutToFirstSignificantSubdomainCustomWithWWW(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部(wwwを含む)。 String

クエリ:

SELECT cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list');

結果:

┌─cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list')─┐
│ www.foo                                                                      │
└──────────────────────────────────────────────────────────────────────────────┘

関連項目

cutToFirstSignificantSubdomainCustomWithWWWRFC

最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返し、wwwは削除しません。 カスタムのTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 cutToFirstSignificantSubdomainCustomWithWWWに似ていますが、RFC 3986に準拠しています。

構文

cutToFirstSignificantSubdomainCustomWithWWWRFC(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部(wwwを含む)。 String

関連項目

firstSignificantSubdomainCustom

最初の重要なサブドメインを返します。 カスタムTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。

設定例:

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

構文

firstSignificantSubdomainCustom(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメイン。 String

クエリ:

SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');

結果:

┌─firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐
│ foo                                                                                      │
└──────────────────────────────────────────────────────────────────────────────────────────┘

関連項目

firstSignificantSubdomainCustomRFC

最初の重要なサブドメインを返します。 カスタムTLDリスト名を受け入れます。 新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 firstSignificantSubdomainCustomに似ていますが、RFC 3986に準拠しています。

構文

firstSignificantSubdomainCustomRFC(url, tld)

引数

  • url — URL。 String
  • tld — カスタムTLDリスト名。 String

返される値

  • 最初の重要なサブドメイン。 String

関連項目

port

ポートを返すか、URLにポートが含まれていないか解析できない場合はdefault_portを返します。

構文

port(url [, default_port = 0])

引数

  • url — URL。 String
  • default_port — 返されるデフォルトのポート番号。 UInt16

返される値

  • URLにポートがない場合、または検証エラーがある場合にはポートまたはデフォルトのポート。 UInt16

クエリ:

SELECT port('http://paul@www.example.com:80/');

結果:

┌─port('http://paul@www.example.com:80/')─┐
│                                      80 │
└─────────────────────────────────────────┘

portRFC

ポートを返すか、URLにポートが含まれていないか解析できない場合はdefault_portを返します。 portに似ていますが、RFC 3986に準拠しています。

構文

portRFC(url [, default_port = 0])

引数

  • url — URL。 String
  • default_port — 返されるデフォルトのポート番号。 UInt16

返される値

  • URLにポートがない場合、または検証エラーがある場合にはポートまたはデフォルトのポート。 UInt16

クエリ:

SELECT
    port('http://user:password@example.com:8080'),
    portRFC('http://user:password@example.com:8080');

結果:

┌─port('http://user:password@example.com:8080')─┬─portRFC('http://user:password@example.com:8080')─┐
│                                             0 │                                             8080 │
└───────────────────────────────────────────────┴──────────────────────────────────────────────────┘

path

クエリ文字列を含まないパスを返します。

例: /top/news.html

pathFull

上記と同じですが、クエリ文字列とフラグメントを含みます。

例: /top/news.html?page=2#comments

protocol

URLからプロトコルを抽出します。

構文

protocol(url)

引数

  • url — プロトコルを抽出するURL。 String

返される値

  • プロトコル、または特定できない場合は空の文字列。 String

クエリ:

SELECT protocol('https://clickhouse.com/');

結果:

┌─protocol('https://clickhouse.com/')─┐
│ https                               │
└─────────────────────────────────────┘

queryString

先頭の質問符や#およびそれ以降を除いたクエリ文字列を返します。

例: page=1&lr=213

fragment

先頭のハッシュ記号を除いたフラグメント識別子を返します。

queryStringAndFragment

クエリ文字列とフラグメント識別子を返します。

例: page=1#29390

extractURLParameter(url, name)

URLにnameという名前のパラメータが存在する場合、その値を返し、存在しない場合は空の文字列を返します。 同じ名前のパラメータが複数ある場合は、最初の出現を返します。 この関数は、urlパラメータ内のパラメータがname引数と同じ方法でエンコードされていると仮定します。

extractURLParameters(url)

URLパラメータに対応するname=value文字列の配列を返します。 値はデコードされません。

extractURLParameterNames(url)

URLパラメータの名前に対応する名前文字列の配列を返します。 値はデコードされません。

URLHierarchy(url)

パスとクエリ文字列の中でURLを後方から/?で切り詰めた配列を返します。 連続した区切り文字は一つとしてカウントされます。 切り取りは連続する区切り文字の後の位置で行われます。

URLPathHierarchy(url)

上記と同じですが、結果にはプロトコルとホストが含まれません。 /要素(ルート)は含まれません。

URLPathHierarchy('https://example.com/browse/CONV-6788') =
[
    '/browse/',
    '/browse/CONV-6788'
]

encodeURLComponent(url)

エンコードされたURLを返します。

例:

SELECT encodeURLComponent('http://127.0.0.1:8123/?query=SELECT 1;') AS EncodedURL;
┌─EncodedURL───────────────────────────────────────────────┐
│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT%201%3B │
└──────────────────────────────────────────────────────────┘

decodeURLComponent(url)

デコードされたURLを返します。

例:

SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL;
┌─DecodedURL─────────────────────────────┐
│ http://127.0.0.1:8123/?query=SELECT 1; │
└────────────────────────────────────────┘

encodeURLFormComponent(url)

エンコードされたURLを返します。rfc-1866に従い、空白( )がプラス(+)としてエンコードされます。

例:

SELECT encodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT 1 2+3') AS EncodedURL;
┌─EncodedURL────────────────────────────────────────────────┐
│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT+1+2%2B3 │
└───────────────────────────────────────────────────────────┘

decodeURLFormComponent(url)

デコードされたURLを返します。rfc-1866に従い、通常のプラス(+)が空白( )としてデコードされます。

例:

SELECT decodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT%201+2%2B3') AS DecodedURL;
┌─DecodedURL────────────────────────────────┐
│ http://127.0.0.1:8123/?query=SELECT 1 2+3 │
└───────────────────────────────────────────┘

netloc

URLからネットワークロケリティusername:password@host:port)を抽出します。

構文

netloc(url)

引数

返される値

  • username:password@host:portString

クエリ:

SELECT netloc('http://paul@www.example.com:80/');

結果:

┌─netloc('http://paul@www.example.com:80/')─┐
│ paul@www.example.com:80                   │
└───────────────────────────────────────────┘

URLの一部を削除する関数

URLに類似するものがない場合、URLは変更されません。

cutWWW

URLのドメインからwww.を削除します(存在する場合)。

cutQueryString

クエリ文字列を含む質問符を削除します。

cutFragment

フラグメント識別子を含む番号記号を削除します。

cutQueryStringAndFragment

クエリ文字列とフラグメント識別子を含む質問符と番号記号を削除します。

cutURLParameter(url, name)

URLからnameというパラメータを削除します(存在する場合)。 この関数は、パラメータ名の文字をエンコードまたはデコードしません。例えば、Client IDClient%20IDは異なるパラメータ名として扱われます。

構文

cutURLParameter(url, name)

引数

  • url — URL。 String
  • name — URLパラメータの名前。 StringまたはStringsのArray

返される値

  • name URLパラメータを削除したURL。 String

クエリ:

SELECT
    cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', 'a') as url_without_a,
    cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', ['c', 'e']) as url_without_c_and_e;

結果:

┌─url_without_a────────────────┬─url_without_c_and_e──────┐
│ http://bigmir.net/?c=d&e=f#g │ http://bigmir.net/?a=b#g │
└──────────────────────────────┴──────────────────────────┘