Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

string functions: add examples for ORD(), MID(), NOT LIKE, MAKE_SET(), and LTRIM() #17182

Merged
merged 8 commits into from
Apr 23, 2024
Merged
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
238 changes: 233 additions & 5 deletions functions-and-operators/string-functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -1206,19 +1206,198 @@ SELECT LPAD('TiDB',-2,'>');

### [`LTRIM()`](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_ltrim)

去掉前缀空格
`LTRIM()` 函数用于删除给定的字符串中的前导空格(即字符串开头的连续空格)。

如果输入的参数为 `NULL`,该函数将返回 `NULL`。

> **注意:**
>
> 该函数只去掉空格字符(U+0020),不去掉其他类似空格的字符,如制表符(U+0009)或非分隔符(U+00A0)。

示例:

在以下示例中,`LTRIM()` 函数删除了 `' hello'` 中的前导空格,并返回 `hello`。

```sql
SELECT LTRIM(' hello');
```

```
+--------------------+
| LTRIM(' hello') |
+--------------------+
| hello |
+--------------------+
1 row in set (0.00 sec)
```

在以下示例中,[`CONCAT()`](#concat) 用于将 `LTRIM(' hello')` 的结果用 `«` 和 `»` 包裹起来。通过这种格式,可以更容易地看到所有前导空格都被删除了。

```sql
SELECT CONCAT('«',LTRIM(' hello'),'»');
```

```
+------------------------------------+
| CONCAT('«',LTRIM(' hello'),'»') |
+------------------------------------+
| «hello» |
+------------------------------------+
1 row in set (0.00 sec)
```

### [`MAKE_SET()`](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_make-set)

返回一组用逗号分隔的字符串,这些字符串的位数与给定的 bits 参数对应
`MAKE_SET()` 函数根据输入的 `bits` 参数中相应的 bit 是否为 `1` 返回一组由逗号分隔的字符串。

语法:

```sql
MAKE_SET(bits, str1, str2, ...)
```

- `bits`:控制其后的字符串参数中的哪些参数会包含到输出结果中。如果 `bits` 为 `NULL`,该函数将返回 `NULL`。
- `str1, str2, ...`:字符串参数列表。每个字符串与 `bits` 参数中从右到左的一个 bit 依次对应。`str1` 对应于 `bits` 中从右起的第一个 bit,`str2` 对应于从右起的第二个 bit,依此类推。如果相应的 bit 为 `1`,则该字符串将包含在输出结果中;否则,将不包含在输出结果中。

示例:

在以下示例中,因为 `bits` 参数中的所有 bit 都为 `0`,该函数将不会在结果中包含 `bits` 后的任何字符串参数,因此返回空字符串。

```sql
SELECT MAKE_SET(b'000','foo','bar','baz');
```

```
+------------------------------------+
| MAKE_SET(b'000','foo','bar','baz') |
+------------------------------------+
| |
+------------------------------------+
1 row in set (0.00 sec)
```

在以下示例中,因为只有从右起的第一个 bit 为 `1`,该函数只返回第一个字符串 `foo`。

```sql
SELECT MAKE_SET(b'001','foo','bar','baz');
```

```
+------------------------------------+
| MAKE_SET(b'001','foo','bar','baz') |
+------------------------------------+
| foo |
+------------------------------------+
1 row in set (0.00 sec)
```

在以下示例中,因为只有从右起的第二个 bit 为 `1`,该函数只返回第二个字符串 `bar`。

```sql
SELECT MAKE_SET(b'010','foo','bar','baz');
```

```
+------------------------------------+
| MAKE_SET(b'010','foo','bar','baz') |
+------------------------------------+
| bar |
+------------------------------------+
1 row in set (0.00 sec)
```

在以下示例中,因为只有从右起的第三个 bit 为 `1`,该函数只返回第三个字符串 `baz`。

```sql
SELECT MAKE_SET(b'100','foo','bar','baz');
```

```
+------------------------------------+
| MAKE_SET(b'100','foo','bar','baz') |
+------------------------------------+
| baz |
+------------------------------------+
1 row in set (0.00 sec)
```

在以下示例中,因为所有 bit 都为 `1`,该函数将返回全部的三个字符串,并以逗号分隔。

```sql
SELECT MAKE_SET(b'111','foo','bar','baz');
```

```
+------------------------------------+
| MAKE_SET(b'111','foo','bar','baz') |
+------------------------------------+
| foo,bar,baz |
+------------------------------------+
1 row in set (0.0002 sec)
```

### [`MID()`](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_mid)

返回一个以指定位置开始的子字符串
`MID(str,pos,len)` 函数返回从指定的 `pos` 位置开始的长度为 `len` 的子字符串。

如果任一参数为 `NULL`,该函数将返回 `NULL`。

TiDB 不支持该函数的两参数版本。更多信息,请参见 [#52420](https://github.com/pingcap/tidb/issues/52420)。

示例:

在以下示例中,`MID()` 返回给定的字符串中从第二个字符 (`b`) 开始的长度为 `3` 个字符的的子字符串。

```sql
SELECT MID('abcdef',2,3);
```

```
+-------------------+
| MID('abcdef',2,3) |
+-------------------+
| bcd |
+-------------------+
1 row in set (0.00 sec)
```

### [`NOT LIKE`](https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_not-like)

否定简单模式匹配
否定简单模式匹配。

该函数的功能与 [`LIKE`](#like) 函数相反。

示例:

在以下示例中,因为 `aaa` 匹配 `a%` 模式,`NOT LIKE` 返回 `0`(代表结果为 False)。

```sql
SELECT 'aaa' LIKE 'a%', 'aaa' NOT LIKE 'a%';
```

```
+-----------------+---------------------+
| 'aaa' LIKE 'a%' | 'aaa' NOT LIKE 'a%' |
+-----------------+---------------------+
| 1 | 0 |
+-----------------+---------------------+
1 row in set (0.00 sec)
```

在以下示例中,因为 `aaa` 与 `b%` 模式不匹配,`NOT LIKE` 返回 `1`(代表结果为 True)。

```sql
SELECT 'aaa' LIKE 'b%', 'aaa' NOT LIKE 'b%';
```

```
+-----------------+---------------------+
| 'aaa' LIKE 'b%' | 'aaa' NOT LIKE 'b%' |
+-----------------+---------------------+
| 0 | 1 |
+-----------------+---------------------+
1 row in set (0.00 sec)
```

### [`NOT REGEXP`](https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_not-regexp)

Expand Down Expand Up @@ -1276,7 +1455,56 @@ SELECT n, OCT(n) FROM nr;

### [`ORD()`](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_ord)

返回该参数最左侧字符的字符编码
返回给定的参数中最左侧字符的字符编码。

该函数的功能类似于 [`CHAR()`](#char),但处理方式相反。

示例:

以 `a` 和 `A` 为例,`ORD()` 返回 `a` 的字符代码 `97` 和 `A` 的字符代码 `65`。

```sql
SELECT ORD('a'), ORD('A');
```

```
+----------+----------+
| ORD('a') | ORD('A') |
+----------+----------+
| 97 | 65 |
+----------+----------+
1 row in set (0.00 sec)
```

如果将从 `ORD()` 获得的字符代码作为 `CHAR()` 函数的输入,即可获取原始字符。请注意,以下输出的格式可能会根据你的 MySQL 客户端是否启用了 `binary-as-hex` 选项而有所不同。

```sql
SELECT CHAR(97), CHAR(65);
```

```
+----------+----------+
| CHAR(97) | CHAR(65) |
+----------+----------+
| a | A |
+----------+----------+
1 row in set (0.01 sec)
```

以下示例展示了 `ORD()` 如何处理多字节字符。`101` 和 `0x65` 都是 `e` 字符的 UTF-8 编码值,但格式不同。`50091` 和 `0xC3AB` 也具有相同的值,但对应 `ë` 字符。
qiancai marked this conversation as resolved.
Show resolved Hide resolved

```sql
SELECT ORD('e'), ORD('ë'), HEX('e'), HEX('ë');
```

```
+----------+-----------+----------+-----------+
| ORD('e') | ORD('ë') | HEX('e') | HEX('ë') |
+----------+-----------+----------+-----------+
| 101 | 50091 | 65 | C3AB |
+----------+-----------+----------+-----------+
1 row in set (0.00 sec)
```

### [`POSITION()`](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_position)

Expand Down
Loading