【问题标题】:How to get maximum value of a specific part of strings?如何获得字符串特定部分的最大值?
【发布时间】:2019-12-14 06:58:51
【问题描述】:

我有以下记录

Id         Title 
500006     FS/97/98/037                                                                                                                                                                                                                                                     
500007     FS/97/04/035                                                                                                                                                                                                                                                    
500008     FS/97/01/036                                                                                                                                                                                                                                                     
500009     FS/97/104/040 

我应该拆分Title 字段并获取文本的第四部分并返回最大值。在此示例中,我的查询应返回 04040

【问题讨论】:

  • 您的数据是否总是包含 4 部分文本?
  • 是的,总是四部分。

标签: sql sql-server sql-server-2017


【解决方案1】:
select max(cast(right(Title, charindex('/', reverse(Title) + '/') - 1) as int))
from your_table

SQLFiddle demo

【讨论】:

    【解决方案2】:

    你可以使用PARSENAME函数,因为你总是有4个部分(在cmets部分确认)

    select max(cast(parsename(replace(Title,'/','.'),1) as int)) 
       from yourtable 
    

    【讨论】:

    • 我认为您需要将/ 替换为. 才能正确使用PARSENAME
    • @juergend 忽略了/,已修复。
    • @Zhorov - 是的,已修复。
    【解决方案3】:

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

    注意,这里不能使用STRING_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】:

      你也可以试试下面的查询。

      SELECT Top 1 
          CAST('<x>' + REPLACE(Title,'/','</x><x>') + '</x>' AS XML).value('/x[4]','int') as Value
      from Data
      order by 1 desc
      

      您可以找到现场演示Here

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多