T-SQL——函式——字串操作函式

shanzm發表於2021-10-10

志銘-2021年10月10日 23:56:04

0. 加號(+)

SELECT 'abc'+'123'結果:abc123

注意若是varchar 型別+int 型別,需要將int型別轉換為varchar型別,方能作為字串相加
SELECT 'abc' + CAST(18 AS VARCHAR(10)) 結果:abc18

1. LEFT和RIGHT

  • 【定義】
    LEFT()返回從左往右指定長度的子字串。
    RIGHT()返回從右往左指定長度的子字串。

  • 【語法】
    LEFT(expressionString,lengthInt)
    RIGHT(expressionString,lengthInt)

    • 注意第二個引數是期望保留的長度
  • 【示例】
    SELECT LEFT('abc',2)返回ab
    SELECT RIGHT('abc',2)返回bc

2. SUBSTRING

  • 【定義】 SUBSTRING()函式用於從字串中提取子串

  • 【語法】 SUBSTRING(expressionString,startInt,lengthInt)

    對字串string,從start索引位置開始,返回length長度的子字串

    注意這裡的索引是從1開始數的

  • 【示例】 SELECT SUBSTRING('abcdef',2,3)結果:bcd

  • 【注意】 若是期望從某個起始位置開始獲取直到結尾的所有字元,可以使用一個比目標字串長度還大的值作為擷取子串的長度引數,SUBSTRING將返回最大起始位置到目標字串的結尾,而不會將多出的長度以空格填充。

    SELECT SUBSTRING('abc',1,9)結果是:"abc",而不是"abc "

3. LEN和DATALENGTH

  • 【定義】
    LEN函式返回指定字串的字元數
    DATALENTH返回的是指定字串的位元組數

  • 【語法】
    LEN(expressionString)
    DATALENGTH(expressionString)

  • 【示例】
    SELECT LEN('abc')結果:3
    SELECT LEN('張三')結果:2

    SELECT DATALENGTH('abc')結果:3
    SELECT DATALENGTH(N'abc')結果:6
    SELECT DATALENGTH('張三')結果:4

  • 【注意】
    LEN函式是計算的是不包含尾隨的空格,而DATALENGTH是會包含尾隨的空格

    SELECT LEN('ab ')結果:2
    SELECT DATALENGTH('ab ')結果:3

4. CHARINDEX和PATINDEX

  • 【定義】
    CHARINDEX用於尋找某一個字元在目標字串第一次出現的起始位置(從1開始數

    PATINDEX用於尋找某個模式的子字串在目標字串中第一次出現的起始位置

  • 【語法】

    • CHARINDEX(str2Find,str2Search)
      • 注意第一個引數是待尋找的子串
    • PATINDEX('%pattern%',str2Search)
  • 【示例】
    SELECT CHARINDEX('ab','abcab')結果:1

    • 這裡'ab'在‘abcab'中出現兩次,但是CHARINDEX函式返回的是第一次出現的位置

    SELECT PATINDEX('%[0-9]%','abc123abc')結果:4
    SELECT PATINDEX('a%','abc123')結果:1
    SELECT PATINDEX('a_c%','abc123')結果:1

    • 這裡的第一個引數是和LIKE謂詞後的模式規則相同

5. REPLACE

  • 【定義】REPLACE函式可以將目標字串中所有出現的某個子字串替換為指定的字串

  • 【語法】
    REPLACE(expressionString,patternString,replacementString)

  • 【示例】

    • 將字串中的'ab'替換為'AB'
      • SELECT REPLACE('ab222ab333ab444','ab','AB')結果:AB222AB333AB444
    • 將字串中的'ab'全部刪除(即全部替換為空格)
      • SELECT REPLACE('ab222ab333ab444','ab','')結果:222333444

6. REPLICATE和SAPCE

  • 【定義】
    REPLICATE用於將指定的字串複製指定的次數

    SPACE用於返回指定長度的空格

  • 【語法】
    REPLICATE(expressString,nInt)
    SPACE(nInt)

  • 【示例】
    SELECT REPLICATE('abc',3)結果:abcabcabc

    SELECT DATALENGTH(SPACE(10))結果:10

7. STUFF

  • 【定義】
    將字串中的一部分替換為另外一個子字串。

    用於替換的子字串不需要和被替換的部分長度一樣。

  • 【語法】
    STUFF(expressionString,startInt,lengthInt,expressionString2)

  • 【示例】

    • 將目標字串中從第4個字元之後的三個字元替換為指定的字串
      SELECT STUFF('abc123def',4,3,'66666666')結果:abc66666666def

    • 將目標字串中的第一個字元替換為空格(相當於刪除目標字串的第一個字元)
      SELECT STUFF(',a,b,c',1,1,'')結果:a,b,c

8. REVERSE

  • 【定義】用於將指定的字串中的字元顛倒過來

  • 【語法】
    REVERSE(expressionString)

  • 【示例】
    SELECT REVERSE('abc')結果:cba

9. UPPER和LOWER

  • 【定義】將指定的字串全部轉換為大寫或小寫

  • 【語法】
    UPPER(expressionString)
    LOWER(expressionString)

  • 【示例】

    SELECT UPPER('aBc')結果:ABC
    SELECT LOWER('aBc')結果:abc

10. LTRIM和RTRIM

  • 【定義】用於將指定的字串的前導空格和尾隨空格刪除

  • 【語法】
    LTRIM(expressionString)
    RTRIM(expressionString)

  • 【示例】

    • 刪除字串前端的空格
      SELECT LTRIM(' abc')結果:abc
    • 刪除字串後端的空格
      SELECT RTRIM('abc ')結果:abc
    • 同時刪除字串前後的空格
      SELECT LTRIM(RTRIM(' abc '))結果:abc

11. QUOTENAME

  • 【定義】預設用於給指定的字串外加一個方括號
    這個函式的第二個引數是可選的,第二個引數只能是英文逗號(,)、英文引號(")或預設的方括號(])

  • 【語法】
    QUOTENAME(expressionString,[character])

  • 【示例】

    SELECT QUOTENAME('Name')結果:[Name]

    SELECT QUOTENAME('Name',')')結果:(Name)

    SELECT QUOTENAME('Name','"')結果:"Name"

12. 綜合使用示例

刪除字串最後一位

DECLARE @a VARCHAR(100)='a,b,c,'
--SELECT LEN(@a)--結果:6

--法1
SELECT LEFT(@a,LEN(@a)-1)
--結果:a,b,c

--法2
SELECT STUFF(@a,LEN(@a),1,'')
--結果:a,b,c

計算某個字串出現的次數

  • 實現思路:將需要計算特定子串出現的次數,全部替換為空格,之後使原始長度減去替換後的長度,即為特定子串出現的次數
DECLARE @str VARCHAR(100)='abcabc'
DECLARE @oldLength INT =LEN(@str)--@oldLength=6
DECLARE @newStr VARCHAR(100)=REPLACE(@str,'a','')--@newStr=bcbc
DECLARE @newLength INT=LEN(@newStr)--@newLength=4
SELECT	@oldLength-@newLength--結果:2

字串統一長度,不足則前面補零

  • 實現思路:甭管當前的長度,一律在該字串前面加上9個0,之後在從右往左擷取指定長度的子串作為結果值
DECLARE @tableVar TABLE
(
    No VARCHAR(100) NOT NULL
);
INSERT INTO @tableVar
(
    No
)
VALUES
('1'),
('12'),
('123'),
('1234'),
('1234');

--字串統一長度為10,不足則前位補0
SELECT RIGHT(REPLICATE('0', 9) + No, 10)FROM @tableVar;--法1
SELECT REPLICATE('0', 10 - LEN(No)) + No AS NO FROM @tableVar;--法2

--結果
--0000000001
--0000000012
--0000000123
--0000001234
--0000001234


--字串統一長度,不足則使用空格在後面補足
SELECT No + SPACE(10 - LEN(No)) FROM @tableVar;--法1
SELECT LEFT(NO+SPACE(10),10) FROM @tableVar;--法2

--驗證上述操作:
SELECT DATALENGTH(No + SPACE(10 - LEN(No))) FROM @tableVar--驗證法1
SELECT DATALENGTH( LEFT(NO+SPACE(10),10)) FROM @tableVar --驗證法2

--結果:
--10
--10
--10
--10
--10

積累待補充中……

相關文章