
# 字符串函数和运算符
#### 字符串运算符
\|\|表示字符连接
```
SELECT 'he'||'llo'; –hello
```
#### 字符串函数
这些函数假定输入字符串包含有效的UTF-8编码的Unicode代码点。不会显式检查UTF-8数据是否有效，对于无效的UTF-8数据，函数可能会返回错误的结果。可以使用from_utf8来更正无效的UTF-8数据。
此外，这些函数对Unicode代码点进行运算，而不是对用户可见的字符（或字形群集）进行运算。某些语言将多个代码点组合成单个用户感知字符（这是语言书写系统的基本单位），但是函数会将每个代码点视为单独的单位。
lower和upper函数不执行某些语言所需的区域设置相关、上下文相关或一对多映射。
- chr(n) → varchar 描述：返回Unicode编码值为n的字符值。
  ```
  select chr(100); --d
  ```
  

- char_length(string) → bigint 参考length(string)
  
- character_length(string) → bigint 参考length(string)
  
- codepoint(*string* ) → integer
  描述：返回单个字符对应的Unicode编码。
  ```
  select codepoint('d'); --100
  ```
  
- concat(string1, string2) → varchar 描述：字符串连接。
  ```
  select concat('hello','world'); -- helloworld
  ```
  

- concat_ws(string0, string1, ..., stringN) → varchar 描述：将string1、string2、...,stringN，以string0作为分隔符串联成一个字符串。如果string0为null，则返回值为null。分隔符后的参数如果是NULL值，将会被跳过。
  ```
  select concat_ws(',','hello','world'); -- hello,world
  select concat_ws(NULL,'def'); --NULL
  select concat_ws(',','hello',NULL,'world'); -- hello,world
  select concat_ws(',','hello','','world'); -- hello,,world
  ```
  
- concat_ws(string0, array(varchar)) → varchar 描述：将数组中的元素以string0为分隔符进行串联。如果string0为null，则返回值为null。数组中的任何null值都将被跳过。
  ```
  select concat_ws(NULL,ARRAY['abc']);--NULL
  select concat_ws(',',ARRAY['abc',NULL,NULL,'xyz']); -- abc,xyz
  select concat_ws(',',ARRAY['hello','world']); -- hello,world
  ```
  
- decode(binary bin, string charset) →varchar 描述：根据给定的字符集将第一个参数编码为字符串，支持的字符集包括（'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'），当第一个参数为null，将返回null。
  ```
  select decode(X'70 61 6e 64 61','UTF-8');
   _col0 
  -------
   panda 
  (1 row)
   
  select decode(X'00 70 00 61 00 6e 00 64 00 61','UTF-16BE');
   _col0 
  -------
   panda 
  (1 row)
  ```
  
- encode(string str, string charset) →binary 描述：字符串按照给定的字符集进行编码。
  ```
  select encode('panda','UTF-8');
       _col0      
  ----------------
   70 61 6e 64 61 
  (1 row)
  ```
  
- find_in_set (string str, string strList) →int 描述：返回str在逗号分隔的strList中第一次出现的位置。当有参数为null时，返回值也为null。
  ```
  select find_in_set('ab', 'abc,b,ab,c,def'); -- 3
  ```
  
- format_number(number x, int d) →string 描述：将数字x格式化为'#,###,###.##'，保留d位小数，以字符串的形式返回结果。
  ```
  select format_number(541211.212,2); -- 541,211.21
  ```
  
- format(format,args...) → varchar 描述：参见[Format](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300196.html#mrs_01_300196__section76601326145112)。
  
- locate(string substr, string str, int pos) →int 描述：返回子串在字符串的第pos位后第一次出现的位置。没有满足条件的返回0。
  ```
  select locate('aaa','bbaaaaa',6);-- 0
  select locate('aaa','bbaaaaa',1);-- 3
  select locate('aaa','bbaaaaa',4);-- 4
  ```
  
- length(string) → bigint 描述：返回字符串的长度。
  ```
  select length('hello');-- 5
  ```
  
- levenshtein_distance(string1, string2) → bigint 描述：计算string1和string2的Levenshtein距离，即将string转为string2所需要的单字符编辑（包括插入、删除或替换）最少次数。
  ```
  select levenshtein_distance('helo word','hello,world'); -- 3
  ```
  
- hamming_distance(*string1* , *string2* ) → bigint
  描述：返回字符串1和字符串2的汉明距离，即对应位置字符不同的数量。 请注意，两个字符串的长度必须相同。
  ```
  select hamming_distance('abcde','edcba');-- 4
  ```
  

- instr(string,substring) → bigint
  描述：查找substring在string中首次出现的位置。
  ```
  select instr('abcde', 'cd');--3
  ```
  
- levenshtein(*string1* , *string2* ) → bigint参考levenshtein_distance(*string1* , *string2*)
- levenshtein_distance(*string1* , *string2* ) → bigint
  描述：返回字符串1和字符串2的Levenshtein编辑距离，即将字符串1更改为字符串2所需的最小单字符编辑（插入，删除或替换）次数。
  ```
  select levenshtein_distance('apple','epplea');-- 2
  ```
  

- lower(string) → varchar 描述：将字符转换为小写。
  ```
  select lower('HELLo!');-- hello!
  ```
  
- lcase(string A) → varchar 描述：同lower(string)。
  

- ltrim(string) → varchar 描述：去掉字符串开头的空格。
  ```
  select ltrim('   hello');-- hello
  ```
  
- lpad(*string* , *size* , *padstring* ) → varchar
  描述：左填充字符串以使用padstring调整字符大小。如果size小于字符串的长度，则结果将被截断为size个字符。大小不能为负，并且填充字符串必须为非空。
  ```
  select lpad('myk',5,'dodo'); -- domyk
  ```
  
 
- luhn_check(string) → boolean 描述：根据Luhn算法测试数字字符串是否有效。
  这种校验和函数，也称为模10，广泛应用于信用卡号码和政府身份证号码，以区分有效号码和键入错误、错误的号码。
  ```
  select luhn_check('79927398713'); -- true
  select luhn_check('79927398714'); -- false
  ```
  
- octet_length(string str) → int 描述：返回用于保存UTF-8编码的字符串str的字节数。
  ```
  select octet_length('query');--5
  ```
  

- parse_url(string urlString, string partToExtract \[, string keyToExtract\]) →string 描述：返回URL的指定部分。partToExtract参数有效值包括：HOST、PATH、QUERY、REF、PROTOCOL、AUTHORITY、FILE和USERINFO。keyToExtract为可选参数，用于选取QUERY中的key对应的值。
  ```
  select parse_url('https://www.example.com/index.html','HOST');
    _col0   
  ----------
   www.example.com
  (1 row)
   
  -- 查询URL中QUERY部分service对应的值
  select parse_url('https://www.example.com/query/index.html?name=panda','QUERY','name');
   _col0 
  -------
   panda 
  (1 row)
  ```
  

- position(*substring IN string* ) →bigint
  描述：返回子串在父串中第一次出现的位置。
  ```
  select position('ab' in 'sssababa');-- 4
  ```
  
- quote(String text) → string 描述：返回单引号包裹的字符串。不支持含单引号的字符串。
  ```
  select quote('DONT');-- 'DONT'
  select quote(NULL);-- NULL
  ```
  

- repeat2(string str, int n) → string 描述：返回str重复n次获得的字符串。
  ```
  select repeat2('abc',4);
      _col0     
  --------------
   abcabcabcabc 
  (1 row)
  ```
  

- replace(string, 'a') → varchar 描述：去掉字符串中的a字符。
  ```
  select replace('hello','e');-- hllo
  ```
  

- replace(string, 'a', 'b') → varchar 描述：把字符串中所有的a字符替换为b。
  ```
  select replace('hello','l','m');-- hemmo
  ```
  

- reverse(string) → varchar 描述：字符串倒序。
  ```
  select reverse('hello');-- olleh
  ```
  
- rpad(*string* , *size* , *padstring* ) → varchar
  描述：右填充字符串以使用padstring调整字符大小。如果size小于字符串的长度，则结果将被截断为size个字符。大小不能为负，并且填充字符串必须为非空。
  ```
  select rpad('myk',5,'doee'); -- mykdo
  ```
  

- rtrim(string) → varchar 描述：去掉字符串尾部的空格。
  ```
  select rtrim('hello world!   ');-- hello world!
  ```
  
- space(int n) → varchar 描述：返回n个空格。
  ```
  select space(4);
   _col0 
  -------
         
  (1 row)
   
  select length(space(4));
   _col0 
  -------
       4 
  (1 row)
  ```
  

- split(string, delimiter) → array 描述：将字符串按限定符（delimiter）分隔为一个array。
  ```
  select split('a:b:c:d',':');-- [a, b, c, d]
  ```
  

- split(string, delimiter, limit) → array 描述：将字符串按delimiter分割为一个array，元素个数为limit。最后一个元素包含了最后一个字符串后面所有的字符。Limit必须是个数字。
  ```
  select split('a:b:c:d',':',2);-- [a, b:c:d]
  select split('a:b:c:d',':',4);-- [a, b, c, d]
  ```
  
- split_part(string, delimiter, index) → varchar 描述：将字符串按delimiter分隔为一个array，并取出索引值为index的元素。index从1开始，如果index超过了数组长度，则返回null。
  ```
  select split_part('a:b:c:d',':',2); -- b
  select split_part('a:b:c:d',':',5); -- NULL
  ```
  
- split_to_map (string, entryDelimiter, keyValueDelimiter) → map\<varchar, varchar\> 描述：将字符串按entryDelimiter分割为Map的键值对，而每个键值对又按照keyValueDelimiter来区分Key和Value。
  ```
  select split_to_map('li:18,wang:17',',',':');--{wang=17, li=18}
  ```
  
- split_to_multimap(string, entryDelimiter, keyValueDelimiter) -\> map(varchar, array(varchar)) 描述：将字符串按照entryDelimiter和keyValueDelimiter分割，返回一个map，每个key对应一个类型为array的value。其中，entryDelimiter将字符串分割为键值对，keyValueDelimiter将键值对分割为Key和Value。
  ```
  select split_to_multimap('li:18,wang:17,li:19,wang:18',',',':');--{wang=[17, 18], li=[18, 19]}
  ```
  

- strpos(string, substring) → bigint 描述：返回字符串中第一次出现substring的位置。从1开始，如果未找到，返回0。举例：
  ```
  select strpos('hello world!','l'); --3
  select strpos('hello world!','da'); --0
  ```
  
- str_to_map() 参考split_to_map()

- substr(string, start) → varchar 描述：从start位置开始截取字符串。
  ```
  select substr('hello world',3);-- llo world
  ```
  

- substr(string, start, length) → varchar 描述：从start位置开始截取字符串，截取的长度为length。
  一般用于截取时间戳格式。
  ```
  Select substr('2019-03-10 10:00:00',1,10); --截取到日 2019-03-10
  Select substr('2019-03-10 10:00:00',1,7); --截取到月 2019-03
  ```
  
- substring(string, start) → varchar 参考substr(string, start)
  

- substring_index(string A, string delim, int count) → varchar 描述：当count为正数时，返回从左边开始计数的第count个分隔符delim左边的所有内容。当count为负数时，返回从右边开始计数的第count个分隔符delim右侧的所有内容。
  ```
  select substring_index('one.two.three','.',2);
        _col0      
  -----------------
   one.two 
  (1 row)
   
  select substring_index('one.two.three','.',-2);
        _col0      
  -----------------
   two.three 
  (1 row)
   
  select substring_index('one.two.three','.',0);
   _col0 
  -------
   NULL  
  (1 row)
  ```
  
- soundex(string A) →varchar 描述：SOUNDEX返回由四个字符组成的代码（SOUNDEX）以评估两个字符串在发音时的相似性。规则如下：
  表1字符对应规则 
  | 字符              | 对应数字 |
  |:---|:---|
  | a、e、h、i、o、u、w、y | 0    |
  | b、f、p、v         | 1    |
  | c、g、j、k、q、s、x、z | 2    |
  | d、t             | 3    |
  | l               | 4    |
  | m、n             | 5    |
  | r               | 6    |
     
  - 提取字符串的首字母作为soundex的第一个值。
  
  - 按照上面的字母对应规则，将后面的字母逐个替换为数字。如果有连续的相等的数字，只保留一个，其余的都删除掉，并去除所有的0。
  
  - 如果结果超过4位，取前四位。如果结果不足4位向后补0。
    ```
    select soundex('Miller');
     _col0 
    -------
     M460  
    (1 row)
    ```
    
   
- translate(string\|char\|varchar input, string\|char\|varchar from, string\|char\|varchar to) →varchar 描述：对于input字符串，将其中的参数from指代字符串替换为参数to指代的字符串。三个参数有一个为NULL，则结果返回NULL。
  ```
  select translate('aabbcc','bb','BB');
   _col0  
  --------
   aaBBcc 
  (1 row)
  ```
  

- trim(string) → varchar 描述：去掉字符串首尾的空格。
  ```
  select trim('  hello world!  ');-- hello world!
  ```
  

- btrim(String str1,String str2) → varchar 描述：从str1首尾去掉str2中包含的所有字符。
  ```
  select btrim('hello','hlo');-- e
  ```
  

- upper(string) → varchar 描述：将字符串转为大写。
  ```
  select upper('heLLo');-- HELLO
  ```
  
- ucase(string A) → varchar 描述：同upper(string)。
  

- base64decode(STRING str) 描述：对字符串进行base64反编码。
  ```
  SELECT to_base64(CAST('hello world' as varbinary));-- aGVsbG8gd29ybGQ=
  select base64decode('aGVsbG8gd29ybGQ=');-- hello world
  ```
  

- jaro_distance(STRING str1, STRING str2) 描述：比较两个字符串的相似度。
  ```
  select JARO_DISTANCE('hello', 'hell');-- 0.9333333333333332
  ```
  

- FNV_HASH(type v) 描述：计算字符串的hash值。
  ```
  select FNV_HASH('hello');-- -6615550055289275125
  ```
  
- word_stem(word) → varchar 描述：返回英语单词的词干。
  ```
  select word_stem('greating');-- great
  ```
  
- word_stem(*word* , *lang* ) → varchar
  描述：返回指定语种单词中的词干。
  ```
  select word_stem('ultramoderne','fr');-- ultramodern
  ```
  
- translate(*source* , *from* , *to* ) → varchar
  描述：通过将源字符串中找到的字符替换为目标字符串中的相应字符来返回翻译后的源字符串。如果from字符串包含重复项，则仅使用第一个。如果源字符在from字符串中不存在，则将复制源字符而不进行翻译。如果在from字符串中匹配字符的索引超出了to字符串的长度，则将从结果字符串中省略源字符。
  ```
  SELECT translate('abcd', '', ''); -- 'abcd'
  SELECT translate('abcd', 'a', 'z'); -- 'zbcd'
  SELECT translate('abcda', 'a', 'z'); -- 'zbcdz'
  SELECT translate('Palhoça', 'ç','c'); -- 'Palhoca'
  SELECT translate('abcd', 'a', ''); -- 'bcd'
  SELECT translate('abcd', 'a', 'zy'); -- 'zbcd'
  SELECT translate('abcd', 'ac', 'z'); -- 'zbd'
  SELECT translate('abcd', 'aac', 'zq'); -- 'zbd'
  ```
  
Unicode函数
- normalize(string) → varchar 描述：返回NFC形式的标准字符串。
  ```
  select normalize('e');
   _col0 
  -------
   e     
  (1 row)
  ```
  
- normalize(string, form) → varchar 描述：Unicode允许你用不同的字节来写相同的字符，例如é和é，第一个是由0xC3 0xA9这两个字节组成的，第二个是由0x65 0xCC 0x81这三个字节组成的。
  normalize()将根据参数form给定的Unicode规范化形式 （包括NFC、NFD、NFKC、NFKD）返回标准字符串，如未指定参数，默认使用NFC。
  ```
  select to_utf8('é');
   _col0 
  -------
   c3 a9 
  (1 row)
   
  select to_utf8('é');
    _col0   
  ----------
   65 cc 81 
  (1 row)
   
  select normalize('é',NFC)=normalize('é',NFC);
   _col0 
  -------
   true  
  (1 row)
  ```
  
- to_utf8(string) → varbinary 将字符串编码为utf8格式字符串。
  ```
  select to_utf8('panda');
       _col0      
  ----------------
   70 61 6e 64 61 
  (1 row)
  ```
  
- from_utf8(binary) → varchar 描述：将一个二进制串编码为UTF-8格式字符串。无效的UTF-8序列将被Unicode字符U+FFFD替换。
  ```
  select from_utf8(X'70 61 6e 64 61');
   _col0 
  -------
   panda 
  (1 row)
  ```
  
- from_utf8(binary, replace) → varchar 描述：将一个二进制串编码为UTF-8格式字符串。无效的UTF-8序列将被参数replace替换。参数replace必须为单个字符或空（以免无效字符被移除）。
  ```
  select from_utf8(X'70 61 6e 64 61 b1','!');
   _col0  
  --------
   panda! 
  (1 row)
  ```
  
 
