首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教如果能使group by区别大小写

2012-01-03 
请问如果能使group by区别大小写系列型号aITOaITO10252aitoaito10253aitoaito11245想得到有几个不同的系列

请问如果能使group by区别大小写
系列     型号
aITO     aITO10252
aito     aito10253
aito     aito11245

想得到有几个不同的系列数,区分大小写应该是2,如何写SQL语句?

[解决办法]
指定排序规则
[解决办法]
转为二进制类型(varbinary)就可以区分大小写了。
[解决办法]
比如说一个表中两条记录的address字段值分别为:aaaa 和 aAAa,如果用
select * from mytable where address = 'aaaa '
则两条记录都查出来了,我希望只得到一条记录,这样的SQL应该怎么写?

create table #a(
[id] [char] (10),
[address] [char] (10)
)
insert into #a(id , address) values( '1 ' , 'aaaa ')
insert into #a(id , address) values( '1 ' , 'aAAa ')

select * from #a where address = 'aaaa ' COLLATE Chinese_PRC_CS_AS
select * from #a where address = 'aAAa ' COLLATE Chinese_PRC_CS_AS

drop table #a

id address
---------- ----------
1 aaaa

(所影响的行数为 1 行)

id address
---------- ----------
1 aAAa

(所影响的行数为 1 行)


如何查只以大写AB开头的呢?
通常情况下写select * from 表名 where 列名 like 'AB% '
但是这样,以小写ab开头的纪录也会被查找出来 如何查只以大写AB开头的呢?
select * from table where left(col,2) = 'AB% ' COLLATE Chinese_PRC_CS_AS
select * from table where col like 'AB% ' COLLATE Chinese_PRC_CS_AS



ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS
--不区分大小写
ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS
--区分大小写
数据库
ALTER DATABASE database
COLLATE Chinese_PRC_CS_AS
--区分大小写

ALTER DATABASE database
COLLATE Chinese_PRC_CI_AS
--不区分大小写


方法一.安装SQL时选择区分大小写
或安装完以后重建mastar,选择区分大小
C:\Program Files\Microsoft SQL Server\80\Tools\Binn\rebuildm.exe

方法二.sql server 8.0以上的版本才可以,7.0及其以下不支持
alter database 数据库 COLLATE Chinese_PRC_CS_AS
修改排序规则,改成大小写敏感的排序规则
如果只修改一个表,用alter table语句
如果修改一个库的默认排序规则,用alter datebase语句
如果修改整个服务器的默认排序规则,用Rebuildm.exe重建master库
--指定排序规则就可以了

--示例
select replace( 'AbacB ' collate Chinese_PRC_CS_AS_WS, 'B ', 'test ')

--如果你是要求表支持,则可以建表时指定排序规则,这样replace就不用写排序规则了

--示例
create table tb(a varchar(20) collate Chinese_PRC_CS_AS_WS)
insert tb values( 'Abac ')

select replace(a, 'a ', 'test ') from tb

drop table tb

指定排序规则即可

Windows 排序规则名称
在 COLLATE 子句中指定 Windows 排序规则名称。Windows 排序规则名称由排序规则指示器和比较风格构成。

语法
< Windows_collation_name > :: =

CollationDesignator_ <ComparisonStyle>

< ComparisonStyle > ::=
CaseSensitivity_AccentSensitivity
[_KanatypeSensitive [_WidthSensitive ] ]
| _BIN

参数
CollationDesignator

指定 Windows 排序规则使用的基本排序规则。基本排序规则包括:

当指定按字典排序时应用其排序规则的字母表或语言


用于存储非 Unicode 字符数据的代码页。
例如 Latin1_General 或法文,两者都使用代码页 1252,或土耳其文,它使用代码页 1254。

CaseSensitivity

CI 指定不区分大小写,CS 指定区分大小写。

AccentSensitivity

AI 指定不区分重音,AS 指定区分重音。

KanatypeSensitive

Omitted 指定不区分大小写,KS 指定区分假名类型。

WidthSensitivity

Omitted 指定不区分大小写,WS 指定区分大小写。

BIN

指定使用二进制排序次序。


如果你只是目前查询区分,那么还是不要这样改,免得又反悔,如此查询:
select * from a


/*
a_nam a_add
---------- ----------
1 aa
1 bb
2 cc
2 vv
2 kk
3 dd
3 ee
4 dd
5 ee
6 yy
6 yy

(11 row(s) affected)
*/
现在我们查询a_add = 'aa '的, 'Aa '等等不行!
Example 1:

select * from a
where a_add collate Chinese_PRC_CS_AS_WS = 'aa '
/*
a_nam a_add
---------- ----------
1 aa

(1 row(s) affected)
*/

Example 2:

select * from a
where a_add collate Chinese_PRC_CS_AS_WS = 'Aa '
/*
a_nam a_add
---------- ----------

(0 row(s) affected)
*/

[解决办法]
select 系列 COLLATE Chinese_PRC_CS_AS
from tb
group by
系列 COLLATE Chinese_PRC_CS_AS
[解决办法]
Create Table TEST
(系列Varchar(10),
型号Varchar(20))
Insert TEST Select 'aITO ', 'aITO10252 '
Union All Select 'aito ', 'aito10253 '
Union All Select 'aito ', 'aito11245 '
GO
Select
系列 COLLATE Chinese_PRC_CS_AS As 系列,
Count(*) As [Count]
From
TEST
Group By系列 COLLATE Chinese_PRC_CS_AS
Order By 系列
GO
Drop Table TEST
/*
系列Count
aito2
aITO1
*/

热点排行