Sql server 确定列值(SQL)中最后一个大写字母的索引?
简短版本:是否有一种方法可以仅使用SQL,根据DB列中最后一个大写字母的索引(位置)轻松提取和排序DB列中的值的子字符串? 长版本:我有一个带有用户名字段的表,用户名的约定是名字的首字母大写,然后是姓氏的首字母大写,然后是姓氏的其余部分。因此,按用户名字段排序是“错误的”。按用户名值的子字符串排序理论上是可行的,例如Sql server 确定列值(SQL)中最后一个大写字母的索引?,sql-server,string,uppercase,Sql Server,String,Uppercase,简短版本:是否有一种方法可以仅使用SQL,根据DB列中最后一个大写字母的索引(位置)轻松提取和排序DB列中的值的子字符串? 长版本:我有一个带有用户名字段的表,用户名的约定是名字的首字母大写,然后是姓氏的首字母大写,然后是姓氏的其余部分。因此,按用户名字段排序是“错误的”。按用户名值的子字符串排序理论上是可行的,例如 子字符串(用户名,2,LEN(用户名)) …除了在其他两个首字母之间有中间首字母大写的值。我很想知道,仅使用SQL(MS SQL Server)是否有一种相当直接/简单的方法: 测
子字符串(用户名,2,LEN(用户名))
…除了在其他两个首字母之间有中间首字母大写的值。我很想知道,仅使用SQL(MS SQL Server)是否有一种相当直接/简单的方法:
DECLARE @Char CHAR(1) = 'f'
SELECT CAST(CASE
WHEN @Char LIKE '[A-Z]' COLLATE Latin1_General_Bin
THEN 1
ELSE 0
END AS BIT)
/* Returns 0 */
注意,使用二进制排序规则而不是具有上述语法的区分大小写的collate子句非常重要。如果使用CS collate子句,则需要将模式完整地拼写为“”[ABCDEFGHIJKLMNOPQRSTUVWXYZ]”
,以避免匹配小写字符
不幸的是,当你意识到答案是“不要那样做”。存储您需要的数据,不要从复杂的数据结构中提取碰巧存在的东西。在Sql server中,这应该很容易,但可能会遇到性能问题。最好将这些名称存储在不同的列中。问题:您的数据都是英文的吗?我正在想出一个类似的解决方案。我建议您将最后一部分改为“反向('X'+用户名)”。这可以防止没有任何大写字母的用户名。@GMastros-在这种情况下,这个答案返回一个空字符串。
SELECT PATINDEX('%[A-Z]%' COLLATE Latin1_General_Bin, REVERSE('Your String'))
/* Returns one based index (6 ) */
SELECT PATINDEX('%[A-Z]%' COLLATE Latin1_General_Bin, REVERSE('no capitals'))
/* Returns 0 if the test string doesn't contain any letters in the range A-Z */
SELECT RIGHT(Name,PATINDEX('%[A-Z]%' COLLATE Latin1_General_Bin ,REVERSE(Name)))
FROM YourTable