我正在尝试找到解决此问题的方法,并在互联网上查看。首先,我找到了一个解决方案,但它似乎并不适用于所有情况。我不明白为什么。
这是我的问题,我正在使用不区分大小写的排序规则,我无法更改列的排序规则以在此列上使用区分大小写。
以下是一个示例和我的测试:
declare @passcap varchar(30)= 'Chanel04O!' collate Latin1_General_CI_AS
select case when binary_checksum(lower(@passcap)) <> binary_checksum(@passcap) and binary_checksum(UPPER(@passcap)) <> binary_checksum(@passcap) then 1 else 0 end as pass_cap
, binary_checksum(lower(@passcap)), binary_checksum(@passcap)
结果应该是1当然因为C和O是大写的。但我收到0。
所以我试图执行binary_checksum并且我收到相同的更低或正常的值:2017408143
但为什么呢?我发现了什么问题,我有数字和额外的字符(!)。
我可以想象做一个正则表达式只接受角色然后与binary_checksum比较,但是有更合适的东西吗?
感谢您的帮助
答案 0 :(得分:1)
只需将字符串的UPPER
和LOWER
值与原始字符串进行比较,然后根据比较的目的对Latin1_General_CS_AS
排序规则进行比较:
SELECT CASE
WHEN @passcap = UPPER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
WHEN @passcap = LOWER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
ELSE 1
END
因此,如果字符串的UPPER
或LOWER
版本匹配,则返回0,否则如果两者都不匹配,则返回1。
请注意,区分大小写的排序规则仅用于比较字符串,因此无需修改表格。