表结构与数据:https://github.com/XuePeng87/TSQLV4
使用字符数据
设计字符数据的查询操作,包括数据类型、排序规则、运算符和函数,以及模式匹配。
数据类型
SQL Server支持两种字符数据类型,即常规和Unicode。常规数据类型包括CHAR和VARCHAR,Unicode数据类型包括NCHAR和NVARCHAR。常规字符的每个字符使用1个字节存储,而Unicode数据的每个字符要求2个字节,并且需要一个代理项对时,要求4个字节。如果为列选择了常规字符类型,会被限制除英语之外仅能使用一种语言。列支持的语言取决于列的有效规则。使用Unicode数据类型可以支持多种语言,所以如果你需要存储多种语言的字符数据,请确保使用Unicode字符类型,而不是常规字符类型。
名称中没有VAR元素的任何数据类型(CHAR、NCHAR)具有固定长度,即SQL Server按照列定义的大小保留行空间,而不是按照字符串中的实际字符数保留空间。
名称中含有VAR元素的数据类型(VARCHAR、NVARCHAR)具有可变长度,即SQL Server根据存储需要,在行中使用尽可能多的存储空间存储字符串中的字符,外加两个额外的字节偏移数据。
可变长度数据类型的数据更新效率低于固定长度数据类型。
还可以使用MAX来定义可变长度数据类型,而不是使用最大字符数。MAX默认是8000个字节,超过这个数值的任何值会作为大型对象(LOB)存储在行的外部。
排序规则
排序规则是一个字符数据属性,包括语言支持、排序顺序、区分大小写和区分重音等。可以查询表函数fn_helpcollations查看支持的排序规则及其说明的结果集。
SELECT name, description FROM sys.fn_helpcollations();
例如,对排序规则Latin1_General_CI_AS的说明:
- Latin1_General:支持英语和德语字符,以及大多数西欧国家使用的字符;
- CI数据不区分大小写(a=A);
- AS数据区分重音(à<>ā);
在企业内部部署SQL Server实施中,排序规则可以定义在4个不同层级:实例、数据库、列和表达式,SQL Server将使用最低有效级别的排序规则。
实例的排序规则是安装程序选择的一部分,它确定所有系统数据库的排序规则,并作为用户数据库的默认规则。数据库的排序规则决定了数据库对象元数据的排序规则,并默认应用与用户列表。可以在列定义中使用COLLATE子句显示地指定列的排序规则,否则默认使用数据库的排序规则。例如:
SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname = N'davis';
将返回lastname=Davis的行,尽管大小写不匹配,但是不区分大小写是有效的书写形式,如果希望筛选区分大小写,那么可以按下面的转换表达式排序规则进行查询:
SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname COLLATE Latin1_General_CS_AS = N'Davis';
运算符和函数
1.字符串连接
T-SQL提供了+和CONCAT函数(SQL Server2012提供)连接字符串,例如:
SELECT empid, firstname + N' ' + lastname AS fullname
FROM HR.Employees;
SELECT custid, country, region, city,
country + N',' + region + N',' + city AS location
FROM Sales.Customers;
SELECT custid, country, region, city,
CONCAT(country, N',' + region, N',' + city) AS location
FROM Sales.Customers;
标准SQL规定了连接NULL的结果应为NULL。而CONCAT函数则会将NULL替换成空字符串。
2.SUBSTRING函数
次函数对于输入的string字符串,从start位置开始,提取length个字符。例如,下面的代码返回"abc":
SELECT SUBSTRING('abcdefg', 1, 3);
如果第三个参数超出了输入的字符串的末尾,并不会引发错误,函数将返回一直到末尾的所有字符。
3.LEFT和RIGHT函数
LEFT和RIGHT函数是SUBSTRING函数的简化形式,可以从输入字符串的左边或右边返回制定数量的字符串,例如,下面的代码返回"ced":
SELECT RIGHT('abced', 3);
4.LEN和DATALENGTH函数
LEN函数返回输入字符串中字符的数量,并且会删除尾随的空格,下面代码返回5:
SELECT LEN(N'abcde')
DATALENGTH函数返回输入字符串存储的字节数,不删除尾随的空格,下面代码返回10:
SELECT DATALENGTH(N'abcde')
5.CHARINDEX函数
CHARINDEX函数返回子字符串在字符串中第一次出现的位置,例如,下面代码返回6:
SELECT CHARINDEX(' ','Itzik Ben-Gan');
6.PATINDEX函数
返回模式在字符串中第一次出现的位置,例如下面的代码返回5:
SELECT PATINDEX('%[0-9]%','abcd123efgh');
7.REPLACE函数
REPLACE(string,substring1,substring2)函数,使用substring2替换string中出现的所有substring1,例如,下面将'1-a 2-b'中的'-'替换成':':
SELECT REPLACE('1-a 2-b', '-', ':')
8.REPLICATE函数
可以按照指定的次数重复一个字符串,例如下面的代码将返回'abcabcabc':
SELECT REPLICATE('abc', 3)
9.STUFF函数
允许从字符串中逸出指定数量的字符,并插入一个替代的新子字符串。例如将'xyz'中的'y'替换成'abc':
SELECT STUFF('xyz', 2, 1, 'abc')
10.UPPER和LOWER函数
将字符串全部转大写或转小写。
11.RTRIM和LTRIM喊出
删除尾随的或者前端的空格。
12.FORMAT函数
允许按照Microsoft.NET格式字符串和一个可选的区域参数,将输入值格式化成另一个字符串,例如将1759前面加上6个0:
SELECT FORMAT(1759, '0000000000')
13.LIKE谓词
1.(%)百分号通配符:代表一个任意大小的字符串,包括空字符串;
2.(_)下划线通配符:代表单个字符;
3.([<List of Characters>])字符列表通配符:方括号内带有字符列表的意思是,代表单个字符必须是列表中的指定字符之一,例如下面的查询返回姓氏的第一个字符是A、B或C的雇员:
SELECT empid, lastname
FROM HR.Employees
WHERE lastname LIKE N'[ABC]%';
4.([<Character>]-<Character>)字符范围通配符:代表单个字符必须在指定的范围内,例如,下面的查询返回姓氏的第一个字符位于字母A~E范围内的雇员:
SELECT empid, lastname
FROM HR.Employees
WHERE lastname LIKE N'[A-E]%';
5.([^<Character List or Range>])未指定范围通配符:代表单个字符没有在指定的字符列表或范围内,例如,下面的查询将返回姓氏第一个字符不是A~E范围内的雇员:
SELECT empid, lastname
FROM HR.Employees
WHERE lastname LIKE N'[^A-E]%';
6.ESCAPE字符
如果想要搜索已用作通配符的字符(如"%"、"_"、"["或]""),需要使用一个转义字符。例如,要检查col1列中是否包含下划线,可以用 col1 LIKE '%!_%' ESCAPE '!'。
来源:oschina
链接:https://my.oschina.net/u/2981366/blog/775513