字符串函數(shù)和操作符
本節(jié)描述了用于檢查和操作字符串值的函數(shù)和操作符。
在這個環(huán)境中的串包括所有類型character
、character varying
和text
的值。 除非特別說明,這些函數(shù)和操作符聲明為接受并返回text
類型。 他們將互換接受character varying
參數(shù)。 在應(yīng)用函數(shù)或操作符之前character
類型的值將被轉(zhuǎn)換為text
,結(jié)果刪除character
值中的任何末尾空格。
SQL 定義了一些字符串函數(shù),它們使用關(guān)鍵字,而不是逗號來分隔參數(shù)。詳情請見 SQL 字符串函數(shù)和操作符表,本數(shù)據(jù)庫也提供了這些函數(shù)使用正常函數(shù)調(diào)用語法的版本(見其他字符串函數(shù)表)。
由于存在從那些數(shù)據(jù)類型到text
的隱式強制措施,在本數(shù)據(jù)庫 8.3 之前,這些函數(shù)也可以接受多種非字符串?dāng)?shù)據(jù)類型。這些強制措施在目前的版本中已經(jīng)被刪除,因為它們常常導(dǎo)致令人驚訝的行為。不過,字符串串接操作符(||
)仍然接受非字符串輸入,只要至少一個輸入是一種字符串類型,如 SQL 字符串函數(shù)和操作符表所示。對于其他情況,如果你需要復(fù)制之前的行為,可以為text
插入一個顯式強制措施。
SQL字符串函數(shù)和操作符
連接兩個字符串。
|
將非字符串輸入轉(zhuǎn)換為文本,然后將兩個字符串串聯(lián)在一起。 (非字符串輸入不能為數(shù)組類型,因為這將在
|
檢查字符串是否在指定的 Unicode 規(guī)范化表單中。 可選的
|
返回字符串中的位數(shù)(8倍于
|
返回字符串中的字符數(shù)。
|
根據(jù)數(shù)據(jù)庫的語言環(huán)境規(guī)則,將字符串轉(zhuǎn)換為全部小寫。
|
將字符串轉(zhuǎn)換為指定的Unicode規(guī)范化形式。 可選的
|
返回字符串的字節(jié)數(shù)。
|
返回字符串中的字節(jié)數(shù)。 由于此版本的函數(shù)直接接受
|
替換
|
返回指定的
|
如果已指定,提取
|
提取匹配POSIX正則表達式的子字符串。
|
提取匹配 SQL 正則表達式的字串。
|
從
|
這是一個非標(biāo)準(zhǔn)的
|
根據(jù)數(shù)據(jù)庫的定位規(guī)則,將字符串轉(zhuǎn)換為所有大寫。
|
還有額外的串操作函數(shù)可以用,它們在其他字符串函數(shù)表中列出。它們有些在內(nèi)部用于實現(xiàn) SQL 字符串函數(shù)和操作符表列出的 SQL 標(biāo)準(zhǔn)字符串函數(shù)。
其他字符串函數(shù)
返回參數(shù)的第一個字符的數(shù)字代碼。在UTF8編碼中,返回該字符的Unicode代碼點。 在其他多字節(jié)編碼中,該參數(shù)必須是一個ASCII字符。
|
從
|
返回給定代碼的字符。在UTF8編碼中該參數(shù)被視作一個Unicode代碼點。 在其他多字節(jié)編碼中該參數(shù)必須指定一個ASCII字符。
|
連接所有參數(shù)的文本表示。空參數(shù)被忽略。
|
用分隔符連接除第一個參數(shù)外的所有參數(shù)。第一個參數(shù)用作分隔符字符串,不應(yīng)為NULL。其他NULL參數(shù)將被忽略。
|
根據(jù)格式字符串對參數(shù)進行格式化。 這個函數(shù)類似于C函數(shù)
|
將每個單詞的第一個字母轉(zhuǎn)換為大寫,其余字母轉(zhuǎn)換為小寫。單詞是由非字母數(shù)字字符分隔的字母數(shù)字字符序列。
|
以字符串返回第一個
|
返回字符串中的字符數(shù)。
|
將
|
從
|
計算參數(shù)的 MD5 hash ,結(jié)果以十六進制形式寫入。
|
將
|
返回當(dāng)前客戶端編碼名稱。
|
返回適合引用的給定字符串,作為SQL語句字符串中的標(biāo)識符。 只有在必要的情況下才添加引號(例如,如果字符串包含非標(biāo)識符字符或?qū)⒈淮笮懻郫B)。 嵌入的引號被適當(dāng)?shù)丶与p引號。
|
返回在SQL語句字符串中適當(dāng)引用的給定字符串,用作字符串文字使用。 嵌入式單引號和反斜線適當(dāng)?shù)姆叮ㄞD(zhuǎn)雙引號或雙斜線)。 請注意,
|
將給定的值轉(zhuǎn)換為文本,然后將其作為字面量引用。 內(nèi)嵌的單引號和反斜杠被適當(dāng)?shù)胤丁?/p>
|
返回在SQL語句字符串中適當(dāng)引用的給定字符串文字;或者,如果參數(shù)為null,則返回
|
將給定值轉(zhuǎn)換為文本,然后將其作為字面量引用;或者,如果參數(shù)為null,則返回
|
返回從POSIX正則表達式到
|
返回通過將POSIX正則表達式與
|
替換匹配POSIX正則表達式的子字符串。
|
使用POSIX正則表達式作為分隔符拆分
|
使用POSIX正則表達式作為分隔符拆分
|
重復(fù)
|
將
|
顛倒字符串中字符的順序。
|
返回字符串中的最后
|
擴展
|
從
|
在
|
返回在
|
提取
|
如果
|
將
|
將數(shù)字轉(zhuǎn)換為其相應(yīng)的十六進制表示形式。
|
將
|
concat
、concat_ws
和format
函數(shù)是可變的,因此可以把要串接或格式化的值作為一個標(biāo)記了VARIADIC
關(guān)鍵字的數(shù)組進行傳遞。 數(shù)組的元素被當(dāng)作函數(shù)的獨立普通參數(shù)一樣處理。如果可變數(shù)組參數(shù)為 NULL,concat
和concat_ws
返回 NULL,但format
把 NULL 當(dāng)作一個零元素數(shù)組。
format
函數(shù)format
根據(jù)一個格式字符串產(chǎn)生格式化的輸出,其形式類似于 C 函數(shù)sprintf
。
format(formatstr text [, formatarg "any" [, ...] ])
formatstr
是一個格式字符串,它指定了結(jié)果應(yīng)該如何被格式化。格式字符串中的文本被直接復(fù)制到結(jié)果中,除了使用格式說明符的地方。格式說明符在字符串中扮演著占位符的角色,它定義后續(xù)的函數(shù)參數(shù)如何被格式化及插入到結(jié)果中。每一個formatarg
參數(shù)會被根據(jù)其數(shù)據(jù)類型的常規(guī)輸出規(guī)則轉(zhuǎn)換為文本,并接著根據(jù)格式說明符被格式化和插入到結(jié)果字符串中。
格式說明符由一個%
字符開始并且有這樣的形式
%[position][flags][width]type
其中的各組件域是:
position
(可選)一個形式為n``$
的字符串,其中n
是要打印的參數(shù)的索引。索引 1 表示formatstr
之后的第一個參數(shù)。如果position
被忽略,默認(rèn)會使用序列中的下一個參數(shù)。
flags
(可選)控制格式說明符的輸出如何被格式化的附加選項。當(dāng)前唯一支持的標(biāo)志是一個負(fù)號(-
),它將導(dǎo)致格式說明符的輸出會被左對齊(left-justified)。除非width
域也被指定,否者這個域不會產(chǎn)生任何效果。
width
(可選)指定用于顯示格式說明符輸出的最小字符數(shù)。輸出將被在左部或右部(取決于-
標(biāo)志)用空格填充以保證充滿該寬度。太小的寬度設(shè)置不會導(dǎo)致輸出被截斷,但是會被簡單地忽略。寬度可以使用下列形式之一指定:一個正整數(shù);一個星號()表示使用下一個函數(shù)參數(shù)作為寬度;或者一個形式為```n
$的字符串表示使用第
n`個函數(shù)參數(shù)作為寬度。
如果寬度來自于一個函數(shù)參數(shù),則參數(shù)在被格式說明符的值使用之前就被消耗掉了。如果寬度參數(shù)是負(fù)值,結(jié)果會在長度為abs
(width
)的域中被左對齊(如果-
標(biāo)志被指定)。
type
(必需)格式轉(zhuǎn)換的類型,用于產(chǎn)生格式說明符的輸出。支持下面的類型:
s
將參數(shù)值格式化為一個簡單字符串。一個控制被視為一個空字符串。I
將參數(shù)值視作 SQL 標(biāo)識符,并在必要時用雙寫引號包圍它。如果參數(shù)為空,將會是一個錯誤(等效于quote_ident
)。L
將參數(shù)值引用為 SQL 文字。一個空值將被顯示為不帶引號的字符串NULL
(等效于quote_nullable
)。
除了以上所述的格式說明符之外,要輸出一個文字形式的%
字符,可以使用特殊序列%%
。
下面有一些基本的格式轉(zhuǎn)換的例子:
SELECT format('Hello %s', 'World');
結(jié)果:Hello World
SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
結(jié)果:Testing one, two, three, %
SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
結(jié)果:INSERT INTO "Foo bar" VALUES('O''Reilly')
SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
結(jié)果:INSERT INTO locations VALUES(E'C:\\Program Files')
下面是使用width
域和-
標(biāo)志的例子:
SELECT format('|%10s|', 'foo');
結(jié)果:| foo|
SELECT format('|%-10s|', 'foo');
結(jié)果:|foo |
SELECT format('|%*s|', 10, 'foo');
結(jié)果:| foo|
SELECT format('|%*s|', -10, 'foo');
結(jié)果:|foo |
SELECT format('|%-*s|', 10, 'foo');
結(jié)果:|foo |
SELECT format('|%-*s|', -10, 'foo');
結(jié)果:|foo |
這些例子展示了position
域的例子:
SELECT format('Testing %3$s, %2$s, %1$s', 'one', 'two', 'three');
結(jié)果:Testing three, two, one
SELECT format('|%*2$s|', 'foo', 10, 'bar');
結(jié)果:| bar|
SELECT format('|%1$*2$s|', 'foo', 10, 'bar');
結(jié)果:| foo|
不同于標(biāo)準(zhǔn)的 C 函數(shù)sprintf
,本數(shù)據(jù)庫的format
函數(shù)允許將帶有或者不帶有position
域的格式說明符被混在同一個格式字符串中。一個不帶有position
域的格式說明符總是使用最后一個被消耗的參數(shù)的下一個參數(shù)。另外,format
函數(shù)不要求所有函數(shù)參數(shù)都被用在格式字符串中。例如:
SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
結(jié)果:Testing three, two, three
對于安全地構(gòu)造動態(tài) SQL 語句,%I
和%L
格式說明符特別有用。
NLS_UPPER
描述
該函數(shù)將字符串中英文字母全部轉(zhuǎn)為大寫。
語法
NLS_UPPER(char [, 'nlsparam' ])
參數(shù)
參數(shù) | 說明 |
char | 指定要轉(zhuǎn)換的字符串。字符串類型可為 |
返回類型
返回與char
相同的類型數(shù)據(jù)。
示例
select NLS_UPPER('aaa BBB CcC') FROM DUAL;
nls_upper
-------------
AAA BBB CCC
NLSSORT
描述
該函數(shù)用于返回排序之后的字符串。
語法
NLSSORT(char [, 'nlsparam' ])
參數(shù)
參數(shù) | 說明 |
char | 指定要排序的字符串。字符串類型可為 |
nlsparam | 指定返回字符串的排序方式,為可選項。 |
返回類型
返回與c
相同的類型數(shù)據(jù)。
示例
CREATE TABLE test (name VARCHAR2(15));
INSERT INTO test VALUES ('ccc');
INSERT INTO test VALUES ('bbb');
INSERT INTO test VALUES ('aaa');
SELECT * FROM test ORDER BY name;
name
-----------
Gaardiner
Gaasten
Gaberd
SELECT * FROM test ORDER BY NLSSORT(name, 'NLS_SORT = Danish');
name
-----------
Gaberd
Gaardiner
Gaasten
REGEXP_INSTR
描述
該函數(shù)作用是返回正則表達式匹配值在源字符串中的位置。
語法
REGEXP_INSTR (source_char, pattern[, position[, occurrence[, return_opt[, match_param[, subexpr]]]]])
參數(shù)
參數(shù) | 說明 |
source_char | 指定用作搜索值的字符表達式,數(shù)據(jù)類型可為 |
pattern | 指定正則表達式截取規(guī)則。它通常是一個文本文字,字符類型可為 |
position | 指定開始正則表達式匹配的起始位置,取值是一個正整數(shù),為可選項。默認(rèn)值是 1,表示從第一個字符開始搜索 |
occurrence | 指定 |
return_opt | 指定返回出現(xiàn)匹配值位置選項,為可選項。默認(rèn)值為
|
match_param | 指定更改正則表達式默認(rèn)匹配方式,為可選項。是數(shù)據(jù)類型
|
subexpr |
|
返回類型
返回NUMBER
類型數(shù)據(jù)
示例
SELECT regexp_instr('abcdefghi', 'd.f') FROM DUAL;
regexp_instr
--------------
4
INSTR
描述
該函數(shù)在一個字符串中搜索指定的字符,返回發(fā)現(xiàn)指定的字符的位置。多字節(jié)字符(漢字、全角符等)按 1 個字符計算。
語法
INSTR(char1,char2[,i[,j]])
參數(shù)
參數(shù) | 說明 |
char1 | 被搜索的字符串。字符串類型可以為 |
char2 | 指定要搜索的字符串。字符串類型可以為 |
i | 搜索的開始位置,默認(rèn)值為 |
j |
|
返回類型
返回NUMBER
類型數(shù)據(jù)
示例
SELECT INSTR('PolarDB-PG','P',1,2) "INSTR" FROM DUAL;
INSTR
-------
9
TRIM
描述
該函數(shù)用來刪除一個字符串的開頭或結(jié)尾(或兩者)的字符。
trim_character
和trim_source
都可以是VARCHAR2
或任何可以隱式轉(zhuǎn)換為 VARCHAR2
的數(shù)據(jù)類型。如果函數(shù)返回值的數(shù)據(jù)類型為VARCHAR2
,則該值的最大長度為trim_source
。
語法
TRIM([{{ LEADING | TRAILING | BOTH }[ trim_character ]|trim_character }FROM] trim_source)
參數(shù)
參數(shù) | 說明 |
LEADING | TRAILING | BOTH | 指定刪除字符的位置。
|
trim_character | 刪除的字符,只能是單個字符。 如果未指定 |
trim_source | 需要被刪除字符的字符串。 如果僅指定 |
返回類型
如果
trim_source
為CHAR
、VARCHAR2
數(shù)據(jù)類型,則函數(shù)返回VARCHAR2
數(shù)據(jù)類型。如果
trim_source
為NCHAR
、NVARCHAR2
數(shù)據(jù)類型,則函數(shù)返回NVARCHAR2
數(shù)據(jù)類型。如果
trim_source
為CLOB
數(shù)據(jù)類型,則函數(shù)返回CLOB
數(shù)據(jù)類型。如果
trim_source
或trim_character
為NULL
,則TRIM
函數(shù)返回NULL
。
示例
SELECT trim(both 'x' from 'x!@#$x') FROM DUAL;
btrim
-------
!@#$
TREAT
描述
該函數(shù)用于更改表達式的聲明類型,必須對類型具有EXECUTE對象權(quán)限才能使用此函數(shù)。
類型必須是已聲明的expr類型的某個超類型或子類型。如果最具體的expr類型是type(或某個子類型),則TREAT返回expr。如果expr的最特定類型不是類型(或某個類型的子類型),則TREAT返回NULL。
只有當(dāng)聲明的expr類型為REF類型時,才能指定REF。
如果聲明的expr類型是expr源類型的REF,則類型必須是expr的源類型的某個子類型或超類型。如果DEREF(expr)的最特定類型是類型(或類型的子類型),則TREAT返回expr。如果DEREF(expr)的最特定類型不是類型(或類型的子類型),則TREAT返回NULL。
此函數(shù)不直接支持CLOB數(shù)據(jù)。但是,CLOB可以通過隱式數(shù)據(jù)轉(zhuǎn)換作為參數(shù)傳入。
語法
TREAT( expr AS [ REF ] [ schema. ]type)
參數(shù)
參數(shù) | 說明 |
expr | 字符串類型可為 |
REF | 可選,指定的REF,只有在expr為REF類型時才可以指定 |
schema | 可選,指定type的schema |
type | 指定的聲明類型 |
返回類型
返回char
類型數(shù)據(jù)
示例
SELECT name, TREAT(VALUE(p) AS employee_t).salary salary FROM persons p;
NAME SALARY
------------------------- ----------
Bob
Joe 100000
Tim 1000
SOUNDEX
描述
該函數(shù)用于返回包含char的發(fā)音表示的字符串,使用此功能可以獲取英語中拼寫不同但發(fā)音相似的單詞。
語法
SOUNDEX(char)
參數(shù)
參數(shù) | 說明 |
char | 字符串類型可為 |
返回類型
返回char
類型數(shù)據(jù)
示例
create table test(c varchar(100));
insert into test values('Smith');
select c from test where SOUNDEX(c) = SOUNDEX('SMYTHE');
c
-------
Smith
REGEEXP_SUBSTR
描述
該函數(shù)允許使用正則表達式搜索字符串并返回匹配字符串,擴展了 SUBSTR
函數(shù)的功能。 該函數(shù)類似于 REGEXP_INSTR
,但它不返回子字符串的位置,而是返回子字符串。如果僅需要匹配字符串的內(nèi)容,但不需要返回其在源字符串中的位置,則此函數(shù)很適用。
語法
REGEXP_SUBSTR(source_char, pattern
[, position [, occurrence [, match_param [, subexpr] ] ] ]
)
參數(shù)
參數(shù) | 說明 |
source_char | 指定用作搜索值的字符表達式,數(shù)據(jù)類型可以為 |
pattern | 指定正則表達式截取規(guī)則。它通常是一個文本字面量,字符類型可以為 |
position | 指定開始正則表達式匹配的起始位置,取值是一個正整數(shù),為可選項。默認(rèn)值是1,表示從第一個字符開始搜索 |
occurrence | 指定 |
match_param | 指定更改正則表達式默認(rèn)匹配方式,為可選項。是數(shù)據(jù)類型
|
subexpr | 指示 |
返回類型
返回與參數(shù)source_char
相同的 VARCHAR2
或 CLOB
數(shù)據(jù)類型。
示例
SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA',',[^,]+,') "REGEXPR_SUBSTR" FROM DUAL;
REGEXPR_SUBSTR
-------------------
, Redwood Shores,
SELECT REGEXP_SUBSTR('http://www.oracle.com/products','http://([[:alnum:]]+\.?){3,4}/?') "REGEXP_SUBSTR" FROM DUAL;
REGEXP_SUBSTR
------------------------
http://www.oracle.com/
NLS_LOWER
描述
該函數(shù)將字符串中英文字母全部轉(zhuǎn)為小寫。
語法
NLS_LOWER(char [, 'nlsparam' ])
參數(shù)
參數(shù) | 說明 |
char | 指定要轉(zhuǎn)換的字符串。字符串類型可為 |
返回類型
返回與char
相同的類型數(shù)據(jù)。
示例
select NLS_LOWER('aaa BBB CcC') FROM DUAL;
nls_lower
-------------
aaa bbb ccc
NLS_INTCAP
描述
該函數(shù)返回字符串并將字符串中每個單詞的首字母大寫,其他字母小寫。單詞由空格或非字母數(shù)字字符分隔。
語法
NLS_INITCAP(c)
參數(shù)
參數(shù) | 說明 |
c | 字符串類型可為 |
返回類型
返回char
類型數(shù)據(jù)
示例
select INITCAP('aaa BBB CcC') FROM DUAL;
initcap
-------------
Aaa Bbb Ccc