顯示具有 字串處理 標籤的文章。 顯示所有文章
顯示具有 字串處理 標籤的文章。 顯示所有文章

2013年9月2日 星期一

SQLServer 正則表示式找尋字元

萬用字元

SQLServer 的 LIKE 及 PATINDEX 函數字串比對可使用下列萬用字元作為模式。

% 代表任何具有零或多個字元的字串。

WHERE title LIKE '%computer%'
找出書名中含有 'computer' 這個字的所有書名。

_(底線) 任何單一字元。
WHERE au_fname LIKE '_ean'
可找出所有以 ean 結尾的四個字母的名字 (如 Dean、Sean 等)。

[ ]在指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單一字元。

WHERE au_lname LIKE '[C-P]arsen'

可找出結尾是 arsen,開頭是 C 和 P 之間的任何單一字元的作者姓氏,例如,Carsen、Larsen、Karsen 等等。

[^] 不在指定範圍 ([^a-f]) 或集合 ([^abcdef]) 中的任何單一字元。
WHERE au_lname LIKE 'de[^l]%'
所有開頭是 de 且下一個字元不是 l 的作者姓氏。

LIKE

判斷特定字元字串是否符合指定的模式。

範例:

A.找出區碼是 07 的所有電話號碼。

WHERE PhoneNumber LIKE '(07)%'

B.使用 NOT LIKE 搭配 % 萬用字元

找出區碼非 07 的所有電話號碼。

WHERE ph.PhoneNumber NOT LIKE '(07)%'

C.使用 ESCAPE 子句

下列範例會利用 ESCAPE 子句和逸出字元來尋找資料行中完全相符的 10-15% 字元字串。

WHERE discount LIKE '%10-15!% off%' ESCAPE '!'

D.使用 [ ] 萬用字元

下列範例會在 Person 資料表上尋找名字為 Cheryl 或 Sheryl 的員工。

 WHERE FirstName LIKE '[CS]heryl';

下列範例會在 Person 資料表上尋找姓氏為 Zheng 或 Zhang 的員工。

SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;

字串比對函數
PATINDEX


PATINDEX ( '%pattern%' , expression )

傳回指定模式,在文字中第一次出現的起始位置,如果找不到便傳回零。


A.搭配 PATINDEX 使用模式


下列範例會尋找 ensure 模式在 Document 資料表中 DocumentSummary 資料行之特定資料列中的起始位置。

SELECT PATINDEX('%ensure%',DocumentSummary)
FROM Production.Document WHERE DocumentNode = 0x7B40;

如果您沒有利用 WHERE 子句來限制要搜尋的資料列,查詢會傳回資料表的所有資料列,且針對找到模式的所有資料列報告非零值,找不到模式的所有資料列則會報告零。

B.搭配 PATINDEX 使用萬用字元

指定的字串中 (索引從 1 開始),使用 % 和 _ 萬用字元來尋找模式 'en' 後面接著任何一個字元和 'ure' 的開始位置:

SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');

PATINDEX 的運作方式就像 LIKE,所以可用萬用字元。
不必用百分比括住模式。
 PATINDEX('a%', 'abc') 會傳回 1 且 PATINDEX('%a', 'cba') 會傳回 3。

與 LIKE 不同的是,PATINDEX 會傳回位置,類似 CHARINDEX。

C.搭配 PATINDEX 使用 COLLATE

下列範例利用 COLLATE 函數來明確指定所搜尋之運算式的定序。


SELECT PATINDEX ( '%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN) ;

D.使用變數來指定模式

下列範例會使用變數,將值傳遞給 pattern 參數。

USE AdventureWorks2012; GO DECLARE @MyValue varchar(10) = 'safety';
SELECT PATINDEX('%' + @MyValue + '%', DocumentSummary)
 FROM Production.Document
WHERE DocumentNode = 0x7B40;

CHARINDEX (Transact-SQL)
SQL Server 2012




在運算式中搜尋另一個運算式,並在找到時傳回它的開始位置。



CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] )

引數

expressionToFind

這是字元運算式,其中包含要尋找的順序。 expressionToFind 的限制為 8000 個字元。expressionToSearch

這是要搜尋的字元運算式。start_location

這是搜尋開始的 integer 或 bigint 運算式。 如果未指定 start_location,或者它是負數或 0,搜尋就會從 expressionToSearch 開頭開始。
傳回類型



如果 expressionToSearch 的資料類型是 varchar(max)、nvarchar(max) 或 varbinary(max),則傳回 bigint,否則傳回 int。
備註



如果 expressionToFind 或 expressionToSearch 是 Unicode 資料類型 (nvarchar 或 nchar),但另一項不是,則另一項也會轉換成 Unicode 資料類型。CHARINDEX 不能用於 text、ntext 和 image 資料類型。

如果 expressionToFind 或 expressionToSearch 是 NULL,CHARINDEX 會傳回 NULL。

如果在 expressionToSearch 內找不到 expressionToFind,CHARINDEX 會傳回 0。

CHARINDEX 會以輸入的定序為基礎來執行比較。 若要執行指定定序的比較,您可以利用 COLLATE,將明確的定序套用至輸入上。

傳回的開始位置是以 1 為基準,而不是以 0 為基準。

0x0000 (char(0)) 是 Windows 定序中未定義的字元,而且不得包含在 CHARINDEX 中。
增補字元 (Surrogate 字組)


使用 SC 定序時,start_location 和傳回值會將 Surrogate 字組計算成一個字元,而不是兩個字元。 如需詳細資訊,請參閱<定序與 Unicode 支援>。
範例


A.傳回運算式的開始位置


下列範例會傳回 bicycle 字元序列在 Document 資料表 DocumentSummary 資料行中的起始位置。


USE AdventureWorks2012; GO DECLARE @document varchar(64); SELECT @document = 'Reflectors are vital safety' + ' components of your bicycle.'; SELECT CHARINDEX('bicycle', @document); GO


以下為結果集:


----------- 48

B.從特定位置執行搜尋


下列範例會利用選擇性的 start_location 參數,在 DocumentSummary 資料行的第五個字元開始搜尋 vital。


USE AdventureWorks2012; GO DECLARE @document varchar(64); SELECT @document = 'Reflectors are vital safety' + ' components of your bicycle.'; SELECT CHARINDEX('vital', @document, 5); GO


以下為結果集:


----------- 16 (1 row(s) affected)

C.搜尋不存在的運算式


下列範例會顯示在 expressionToSearch 內找不到 expressionToFind 時的結果集。


USE AdventureWorks2012; GO DECLARE @document varchar(64); SELECT @document = 'Reflectors are vital safety' + ' components of your bicycle.'; SELECT CHARINDEX('bike', @document); GO


以下為結果集:

-----------

0



(1 row(s) affected)
D.執行區分大小寫的搜尋


下列範例會在 'Das ist ein Test' 中,以區分大小寫的方式搜尋 'TEST' 字串。


USE tempdb; GO --perform a case sensitive search SELECT CHARINDEX ( 'TEST', 'Das ist ein Test' COLLATE Latin1_General_CS_AS);




以下為結果集:

-----------

0



下列範例會在 'Das ist ein Test' 中,以區分大小寫的方式搜尋 'Test' 字串。


USE tempdb; GO SELECT CHARINDEX ( 'Test', 'Das ist ein Test' COLLATE Latin1_General_CS_AS);




以下為結果集:

-----------

13
E.執行不區分大小寫的搜尋


下列範例會在 'Das ist ein Test' 中,以不區分大小寫的方式搜尋 'TEST' 字串。


USE tempdb; GO SELECT CHARINDEX ( 'TEST', 'Das ist ein Test' COLLATE Latin1_General_CI_AS) GO




以下為結果集:

-----------

13

2013年8月25日 星期日

MS SQL Server字串處理

字元轉換

UPPER (Transact-SQL)

傳回小寫字元資料轉換成大寫的字元運算式。

語法

UPPER ( character_expression )

引數

character_expression

這是字元資料的運算式。 character_expression 可以是字元或二進位資料的常數、變數或資料行。

character_expression 必須是可以隱含轉換成 varchar 的資料類型。 否則,請利用 CAST 來明確轉換 character_expression。

傳回類型
varchar 或nvarchar
範例

下列範例會利用 UPPER 和 RTRIM 函數來傳回 Person 資料表中的人員姓氏,因此,這些姓氏是大寫、修剪過,且與名字串連起來。


SELECT UPPER(RTRIM(LastName)) + ', ' + FirstName AS Name FROM Person.Person ORDER BY LastName


字串取代

REPLACE (Transact-SQL)

語法

REPLACE ( string_expression , string_pattern , string_replacement )

引數

string_expression

這是要搜尋的字串運算式。 string_expression 可以是字元或二進位資料類型。

string_pattern

這是要尋找的子字串。 string_pattern 可以是字元或二進位資料類型。 string_pattern 不可以是空字串 (''),並且不得超過分頁所能容納的最大位元組數目。

string_replacement

這是取代字串。 string_replacement 可以是字元或二進位資料類型。

傳回類型


如果其中一個輸入引數是 nvarchar 資料類型,便傳回 nvarchar;否則,REPLACE 會傳回 varchar。

如果任何一個引數是 NULL,便會傳回 NULL。

如果 string_expression 不是 varchar(max) 或 nvarchar(max), 類型,REPLACE 會在 8,000 位元組的位置截斷傳回值。 若要傳回大於 8,000 位元組的值,string_expression 必須明確轉換成大數值資料類型。
備註



REPLACE 會以輸入的定序為基礎來執行比較。 若要執行指定定序的比較,您可以利用 COLLATE,將明確的定序套用至輸入上。

0x0000 (char(0)) 是 Windows 定序中未定義的字元,而且不得包含在 REPLACE 中。
範例



下列範例利用 xxx 來取代 abcdefghi 中的 cde 字串。


SELECT REPLACE('abcdefghicde','cde','xxx'); GO


以下為結果集:


------------ abxxxfghixxx (1 row(s) affected)


下列範例使用 COLLATE 函數。


SELECT REPLACE('Das ist ein Test' COLLATE Latin1_General_BIN, 'Test', 'desk' ); GO


以下為結果集:


------------ Das ist ein desk (1 row(s) affected)


2013年4月30日 星期二

SQLServer 日期字串轉換

SQL Server 處理日期欄位轉字串的時候可利用 CONVERT 函數。

字串轉成日期格式


select CONVERT(datetime ,'20060410' ,111 ) 

就會是日期的格式了,在資料庫存的樣子==>2006-04-10 00:00:00.000

to_date是oracle的用法。

日期轉成字串格式

如果你要輸出 2008-02-27 這種日期格式的字串,可以這樣寫:

SELECT CONVERT(char(10), getdate(), 120)

底下列出一些常用語法:

SELECT CONVERT(char(8), getdate(), 112)
輸出格式:20080227

SELECT CONVERT(char(6), getdate(), 12)
輸出格式:080227

SELECT SUBSTRING(CONVERT(char(6), getdate(), 12), 3, 4)
輸出格式:0227

SELECT CONVERT(char(19), getdate(), 120)
輸出格式:0227

SELECT CONVERT(char(19), getdate(), 120)
輸出格式:2008-02-27 00:25:13

SELECT CONVERT(char(10), getdate(), 20)
輸出格式:2008-02-27

SELECT CONVERT(char(10), getdate(), 102)
輸出格式:2008.02.27

SELECT CONVERT(char(8), getdate(), 2)
輸出格式:08.02.27

SELECT CONVERT(char(10), getdate(), 111)
輸出格式:2008/02/27

SELECT CONVERT(char(8), getdate(), 11)
輸出格式:08/02/27