Sql server 确定列值(SQL)中最后一个大写字母的索引?

Sql server 确定列值(SQL)中最后一个大写字母的索引?,sql-server,string,uppercase,Sql Server,String,Uppercase,简短版本:是否有一种方法可以仅使用SQL,根据DB列中最后一个大写字母的索引(位置)轻松提取和排序DB列中的值的子字符串? 长版本:我有一个带有用户名字段的表,用户名的约定是名字的首字母大写,然后是姓氏的首字母大写,然后是姓氏的其余部分。因此,按用户名字段排序是“错误的”。按用户名值的子字符串排序理论上是可行的,例如 子字符串(用户名,2,LEN(用户名)) …除了在其他两个首字母之间有中间首字母大写的值。我很想知道,仅使用SQL(MS SQL Server)是否有一种相当直接/简单的方法: 测

简短版本:是否有一种方法可以仅使用SQL,根据DB列中最后一个大写字母的索引(位置)轻松提取和排序DB列中的值的子字符串?

长版本:我有一个带有用户名字段的表,用户名的约定是名字的首字母大写,然后是姓氏的首字母大写,然后是姓氏的其余部分。因此,按用户名字段排序是“错误的”。按用户名值的子字符串排序理论上是可行的,例如

子字符串(用户名,2,LEN(用户名))

…除了在其他两个首字母之间有中间首字母大写的值。我很想知道,仅使用SQL(MS SQL Server)是否有一种相当直接/简单的方法:

  • 测试DB值中字符的大小写(并返回布尔值)
  • 确定字符串值中最后一个大写字符的索引
  • 假设这是可能的,我假设你必须循环每个用户名的字母来完成它,这使得它非常低效,但是如果你有一个神奇的快捷方式,请随意分享注意:这个问题纯粹是学术性的,因为我后来决定用一种更简单的方法来回答。我只是好奇这是否可能

  • 测试DB值中字符的大小写(并返回布尔值)
  • 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