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-是的,已修复。