gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:53:37 25 4
gpt4 key购买 nike

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

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

SUBSTRING(用户名,2, LEN(用户名))

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

  1. 测试数据库值中字符的大小写(并返回 bool 值)
  2. 确定字符串值中最后一个大写字符的索引

假设这甚至是可能的,我认为人们必须循环遍历每个用户名的各个字母才能完成它,这使得效率非常低,但如果您有一个神奇的快捷方式,请随时分享。 注意:这个问题纯粹是学术性的,因为我后来决定采用更简单的方法。我只是好奇这是否可能。

最佳答案

  1. Test the case of a character in a DB value (and return a boolean)

SQL Server 没有 bool 数据类型。 bit 经常用来代替它。

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 */

请注意,在上述语法中使用二进制排序规则而不是区分大小写的排序子句非常重要。如果使用 CS 整理子句,则需要将模式完整拼写为 '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' 以避免匹配小写字符。

  1. Determine the index of the last upper case character in a string value
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 */
  1. To extract the surname according to those rules you can use
SELECT RIGHT(Name,PATINDEX('%[A-Z]%' COLLATE Latin1_General_Bin ,REVERSE(Name)))
FROM YourTable

关于sql-server - 确定列值中最后一个大写字母的索引(SQL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30468526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com