类别:

:doc:`/sql-reference/functions-string`(通用)

PARSE_URL

返回一个 OBJECT 值,该值由有效输入 URL/URI 中的所有部分(片段、主机、参数、路径、端口、查询、方案)组成。

语法

PARSE_URL(<string>, [<permissive>])
Copy

实参

必填:

string

要解析的字符串。

可选:

permissive

确定如何处理解析错误的标志:

  • 如果设置为 0,则解析错误会导致函数失败。

  • 如果设置为 1,则解析错误会导致具有 error 字段的对象设置为相应的错误消息(并且未设置其他字段)。

默认值为 0

返回

该函数返回 OBJECT 类型的值。

如果任何输入实参为 NULL,则函数返回 NULL。

返回 OBJECT 值时,其中包含以下键值对:

fragment

指向位置的锚点。

host

域(网站或服务器的地址)。

parameters

传递给网站或服务器的值。

path

资源的位置。

port

端口(进程或服务的连接端点)。

query

传递给网站或服务器的查询字符串。

scheme

协议。

示例

以下示例使用 PARSE_URL 函数。

解析表数据中的 URLs

创建表并插入行:

CREATE OR REPLACE TABLE parse_url_test (id INT, sample_url VARCHAR);

INSERT INTO parse_url_test VALUES
  (1, 'mailto:abc@xyz.com'),
  (2, 'https://www.snowflake.com/'),
  (3, 'http://USER:PASS@EXAMPLE.INT:4345/HELLO.PHP?USER=1'),
  (4, NULL);

SELECT * FROM parse_url_test;
Copy
+----+----------------------------------------------------+
| ID | SAMPLE_URL                                         |
|----+----------------------------------------------------|
|  1 | mailto:abc@xyz.com                                 |
|  2 | https://www.snowflake.com/                         |
|  3 | http://USER:PASS@EXAMPLE.INT:4345/HELLO.PHP?USER=1 |
|  4 | NULL                                               |
+----+----------------------------------------------------+

以下查询显示了示例 URLs 的 PARSE_URL 结果:

SELECT PARSE_URL(sample_url) FROM parse_url_test;
Copy
+------------------------------------+
| PARSE_URL(SAMPLE_URL)              |
|------------------------------------|
| {                                  |
|   "fragment": null,                |
|   "host": null,                    |
|   "parameters": null,              |
|   "path": "abc@xyz.com",           |
|   "port": null,                    |
|   "query": null,                   |
|   "scheme": "mailto"               |
| }                                  |
| {                                  |
|   "fragment": null,                |
|   "host": "www.snowflake.com",     |
|   "parameters": null,              |
|   "path": "",                      |
|   "port": null,                    |
|   "query": null,                   |
|   "scheme": "https"                |
| }                                  |
| {                                  |
|   "fragment": null,                |
|   "host": "USER:PASS@EXAMPLE.INT", |
|   "parameters": {                  |
|     "USER": "1"                    |
|   },                               |
|   "path": "HELLO.PHP",             |
|   "port": "4345",                  |
|   "query": "USER=1",               |
|   "scheme": "http"                 |
| }                                  |
| NULL                               |
+------------------------------------+

此查询显示了每个示例 URL 的主机:

SELECT PARSE_URL(sample_url):host FROM parse_url_test;
Copy
+----------------------------+
| PARSE_URL(SAMPLE_URL):HOST |
|----------------------------|
| null                       |
| "www.snowflake.com"        |
| "USER:PASS@EXAMPLE.INT"    |
| NULL                       |
+----------------------------+

返回端口为 4345 的行:

SELECT *
  FROM parse_url_test
  WHERE PARSE_URL(sample_url):port = '4345';
Copy
+----+----------------------------------------------------+
| ID | SAMPLE_URL                                         |
|----+----------------------------------------------------|
|  3 | http://USER:PASS@EXAMPLE.INT:4345/HELLO.PHP?USER=1 |
+----+----------------------------------------------------+

返回主机为 www.snowflake.com 的行:

SELECT *
  FROM parse_url_test
  WHERE PARSE_URL(sample_url):host = 'www.snowflake.com';
Copy
+----+----------------------------+
| ID | SAMPLE_URL                 |
|----+----------------------------|
|  2 | https://www.snowflake.com/ |
+----+----------------------------+

解析无效 URLs

解析缺少架构的无效 URL。将 permissive 实参设置为 0,即表示如果输入无效,函数将失败:

SELECT PARSE_URL('example.int/hello.php?user=12#nofragment', 0);
Copy
100139 (22000): Error parsing URL: scheme not specified

解析无效 URL,通过将 permissive 实参设置为 1,即表示函数返回包含错误消息的 OBJECT 值:

SELECT PARSE_URL('example.int/hello.php?user=12#nofragment', 1);
Copy
+----------------------------------------------------------+
| PARSE_URL('EXAMPLE.INT/HELLO.PHP?USER=12#NOFRAGMENT', 1) |
|----------------------------------------------------------|
| {                                                        |
|   "error": "scheme not specified"                        |
| }                                                        |
+----------------------------------------------------------+
语言: 中文