Sql 如何获得字符串特定部分的最大值?

Sql 如何获得字符串特定部分的最大值?,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,我有以下记录 Id Title 500006 FS/97/98/037

我有以下记录

Id         Title 
500006     FS/97/98/037                                                                                                                                                                                                                                                     
500007     FS/97/04/035                                                                                                                                                                                                                                                    
500008     FS/97/01/036                                                                                                                                                                                                                                                     
500009     FS/97/104/040 
我应该拆分
Title
字段,并获取文本的第四部分并返回最大值。在本例中,我的查询应该返回
040
40

select max(cast(right(Title, charindex('/', reverse(Title) + '/') - 1) as int))
from your_table

如果要拆分
Title
列中的数据,并按位置从拆分的文本中获取部分,可以尝试使用一种基于JSON的方法和简单的字符串转换。您需要将
Title
列中的数据转换为有效的JSON数组(FS/97/98/037转换为[“FS”、“97”、“08”、“037”),然后使用
OPENJSON()解析数据。
OPENJSON()
(使用默认模式并解析
JSON
数组)的结果是一个表,其中包含
key
value
type
,并且
key
列包含
JSON
数组中项目的索引:

注意,使用
STRING\u SPLIT()
在这里不是一个选项,因为返回行的顺序不能保证

表:

CREATE TABLE Data (
   Id varchar(6),
   Title varchar(50)
)
INSERT INTO Data
   (Id, Title)
VALUES
   ('500006', 'FS/97/98/037'),                                                                                                                                                                                                                                                    
   ('500007', 'FS/97/04/035'),                                                                                                                                                                                                                                                    
   ('500008', 'FS/97/01/036'),                                                                                                                                                                                                                                                  
   ('500009', 'FS/97/104/040')
声明:

SELECT MAX(j.[value])
FROM Data d
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(d.Title, '/', '","'), '"]')) j
WHERE (j.[key] + 1) = 4
如果您的数据具有固定格式,包含4个部分,即使这种方法也可能有帮助:

SELECT MAX(PARSENAME(REPLACE(Title, '/', '.'), 1))
FROM Data

如果要拆分
Title
列中的数据,并按位置从拆分的文本中获取部分,可以尝试使用一种基于JSON的方法和简单的字符串转换。您需要将
Title
列中的数据转换为有效的JSON数组(FS/97/98/037转换为[“FS”、“97”、“08”、“037”),然后使用
OPENJSON()解析数据。
OPENJSON()
(使用默认模式并解析
JSON
数组)的结果是一个表,其中包含
key
value
type
,并且
key
列包含
JSON
数组中项目的索引:

注意,使用
STRING\u SPLIT()
在这里不是一个选项,因为返回行的顺序不能保证

表:

CREATE TABLE Data (
   Id varchar(6),
   Title varchar(50)
)
INSERT INTO Data
   (Id, Title)
VALUES
   ('500006', 'FS/97/98/037'),                                                                                                                                                                                                                                                    
   ('500007', 'FS/97/04/035'),                                                                                                                                                                                                                                                    
   ('500008', 'FS/97/01/036'),                                                                                                                                                                                                                                                  
   ('500009', 'FS/97/104/040')
声明:

SELECT MAX(j.[value])
FROM Data d
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(d.Title, '/', '","'), '"]')) j
WHERE (j.[key] + 1) = 4
如果您的数据具有固定格式,包含4个部分,即使这种方法也可能有帮助:

SELECT MAX(PARSENAME(REPLACE(Title, '/', '.'), 1))
FROM Data
您可以使用该功能,因为您总是有4个部分(在评论部分确认)

您可以使用该功能,因为您总是有4个部分(在评论部分确认)


您也可以尝试下面的查询

SELECT Top 1 
    CAST('<x>' + REPLACE(Title,'/','</x><x>') + '</x>' AS XML).value('/x[4]','int') as Value
from Data
order by 1 desc
选择前1名
强制转换(“”+REPLACE(Title,“/”,“”)+“”)为XML。值(“/x[4]”,int”)为值
从数据
按1描述订购

您可以找到实时演示。

您也可以尝试以下查询

SELECT Top 1 
    CAST('<x>' + REPLACE(Title,'/','</x><x>') + '</x>' AS XML).value('/x[4]','int') as Value
from Data
order by 1 desc
选择前1名
强制转换(“”+REPLACE(Title,“/”,“”)+“”)为XML。值(“/x[4]”,int”)为值
从数据
按1描述订购

你可以找到现场演示。

你的数据总是包含4部分文本吗?是的,它总是4部分。你的数据总是包含4部分文本吗?是的,它总是4部分。我认为你需要用
替换
/
,才能正确使用
PARSENAME
。@juergend忽略了
/
,修复了。@Zhorov-yep,已修复。我认为您需要将
/
替换为
,才能正确使用
PARSENAME
。@juergend忽略了
/
,已修复。@Zhorov-是的,已修复。