我认为这样可行:
select * from tbl where ascii(field1) <> ascii(upper(field1))
确实它给了我一些记录。它们已被纠正,现在该查询不返回任何数据。但是我有人告诉我数据库中仍有混合的案例数据,我只是找到了一个例子:'FS'和'Fs'都报告了相同的ascii值。
为什么这种方法存在缺陷?有什么更好的方法可以解决这个问题,或者我如何才能使这种方法正常工作?
答案 0 :(得分:5)
如果所有日期都应该是大写的,只需进行更新
update tbl
set field1 = upper(field1)
但要回答原始问题,此查询应该会为您提供您期望的结果:
select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)
编辑:注意到使用COLLATE的建议也由Ian
发布答案 1 :(得分:3)
ASCII只比较第一个字母。您必须比较每个字母,或更改数据库归类以区分大小写。
您可以更改整个数据库级别的排序规则,或仅针对特定查询更改一列,因此:
SELECT myColumn
FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
答案 2 :(得分:2)
如果将多个字符串传递给表达式,则ascii()函数将仅返回表达式中第一个字符的ascii编号。要进行比较,您需要查看单个字符,而不是整个字段。
答案 3 :(得分:1)
ASCII()函数仅返回字符表达式最左侧字符的ASCII代码值。改为使用UPPER()。
答案 4 :(得分:1)
这可能有效:
select * from tbl
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
答案 5 :(得分:1)
Case sensitive search in SQL Server queries中描述的方法可能对您有用。
答案 6 :(得分:0)
根据documentation for ASCII()
,它只返回最左边的字符。
我认为你错了。 你可以简单地说:
select * from tbl where field1 <> upper(field1)
如果正确设置了整理规则,so why not fix the collation rules?如果您无法永久更改它们,请尝试:
select * from tbl where
(field1 collate Latin1_General_CS_AS)
<> upper(field1 collate Latin1_General_CS_AS)