SQL按字母顺序排序不区分大小写

3

今天我遇到了一个困扰我很难解决的问题。

在应用程序中,我想按字母顺序显示记录,因此在 SQL 语句中使用了 ORDER BY,
但看起来大写字母在小写字母之前,所以以 Z 开头的记录在 a 之前。

这是我的 SQL 语句示例:

SELECT * FROM myTable WHERE id= 5 ORDER BY name

你有什么想法吗?我可以在从数据库检索数据后对 DataTable 对象进行排序吗?或者可以通过更复杂的 SQL 语句实现吗?

任何想法都将不胜感激


你的问题看起来非常像这个问题。https://dev59.com/Mmkw5IYBdhLWcg3wlrka - DidIReallyWriteThat
5个回答

6
你可以修改你的SQL查询,使所有大写字母在排序之前转换为小写。
SELECT * FROM myTable WHERE id = 5 ORDER BY LOWER(name)

2
比较文本值的规则是“排序规则(collation)”; SQL Server提供了许多排序规则,大多数都有区分大小写和不区分大小写的选项。
如果您不想更改排序规则(特别是仅适用于特定情况的情况下),也可以使用像LOWER / UPPER这样的函数,但这不能有效地使用索引。一种混合方法是存储冗余信息:将原始数据存储在一个列中,将标准化数据(可能是所有小写不变的)存储在第二个列中。然后,您可以分别对两个索引进行索引(根据需要),并操作原始数据或标准化数据。通常只会显示原始数据。在这里,持久化+计算+索引列可能效果很好,因为服务器负责计算列,所以不可能出现不一致的数据。

感谢提供有用的信息,这些信息可能在未来很有用,但目前我正在处理旧的现有数据,无法更改数据结构。 - user3455363
1
@user3455363 噢,如果每次我听到“我需要让它表现不同,但是我不能改变任何东西”都有1英镑该多好啊。嗯...如果你不改变任何东西:就要期待它保持原样;p - Marc Gravell

1

尝试

   SELECT * FROM myTable WHERE id= 5 ORDER BY LOWER(name)

或者

   SELECT * FROM myTable WHERE id= 5 ORDER BY LCASE(name)

根据您使用的数据库而定


我已经尝试了LCASE,LOWER,UCASE,UPPER,但它们都不起作用,并抛出异常:System.Data.OleDb.OleDbException:SQL:ORDER BY子句无效。 string sql =“SELECT * FROM app_lookup WHERE nid =”+ npk +“ ORDER BY LCASE(cdesc)”; - user3455363

1

你可以通过在 SQL 中指定大小写来进行排序。只需要这样做:

SELECT * FROM myTable WHERE id= 5 ORDER BY UPPER(name) 

或者

SELECT * FROM myTable WHERE id= 5 ORDER BY UCASE(name)

订购将根据大写名称进行,而您的结果将与表中的现有内容相同。


0

试试这个...

SELECT * FROM myTable WHERE id= 5 ORDER BY name COLLATE Latin1_General_100_CI_AS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接