【问题标题】:sql server string split last but onesql server 字符串最后拆分为一个
【发布时间】:2018-05-23 14:42:18
【问题描述】:

表格有一列包含值

 ColA
------

a.b.c.d.e (car.make.model, car.la, kg)

ab.cd.ef (car.make.model)

a1.b2.c3.d4.e5(car.make.model, car.la, kg, av.vc.de)

我想编写一个 sql 查询来通过分隔符“。”分割 ColA。并选择最后一个。

预期输出

Result
------
d

cd

d4

我已经尝试过 ParseName,但没有看到选择最后一个的选项。

谢谢

【问题讨论】:

标签: sql sql-server sql-server-2016


【解决方案1】:

使用 Jeff Moden 的DelimitedSplit8K

USE Sandbox;
GO

CREATE TABLE #Sample (ColA varchar(500));
GO
INSERT INTO #Sample
VALUES ('a.b.c.d.e'),
       ('ab.cd.ef'),
       ('a1.b2.c3.d4.e5');
GO

SELECT *
FROM #Sample;

WITH Split AS(
    SELECT S.ColA,
           DS.*,
           MAX(DS.ItemNumber) OVER (PARTITION BY S.ColA) AS Items
    FROM #Sample S
         CROSS APPLY DelimitedSplit8K(S.ColA,'.') DS)
SELECT Item
FROM Split
WHERE ItemNumber = Items - 1;

GO

DROP TABLE #Sample

不过,理想情况下,不要以分隔格式存储您的数据。 :)

【讨论】:

  • +1 以获得很好的答案。 +1000000 表示“不过,理想情况下,不要以分隔格式存储您的数据。”。
【解决方案2】:

只是为了玩弄STRING_SPLIT

SELECT ColA, t.value
FROM table1
CROSS APPLY(SELECT value, 
                   COUNT(*) OVER () as cnt,
                   ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
            FROM STRING_SPLIT(ColA, '.')) AS t
WHERE t.rn = t.cnt - 1

注意:该函数可从 SQL Server 2016 开始使用。

注意 2: 如果函数返回每个值的顺序与其在字符串中出现的顺序相同,则该查询有效。

【讨论】:

    【解决方案3】:

    为什么不简单地使用子字符串?

    DECLARE @ColA NVARCHAR(100) = 'a1.b2.c3.d4.e5(car.make.model, car.la, kg, av.vc.de)';
    SELECT REVERSE(LEFT(RIGHT(REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)), LEN(LEFT(@ColA, CHARINDEX('(', @ColA)-1))-CHARINDEX('.',REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)))), CHARINDEX('.',RIGHT(REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)), LEN(LEFT(@ColA, CHARINDEX('(', @ColA)-1))-CHARINDEX('.',REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)))))-1))
    

    但是,当字符串中没有 .( 时,最后一次编辑不会处理这种情况 - 请随意扩展查询

    【讨论】:

    • @sri 我根据你上次的编辑修改了查询
    【解决方案4】:

    试试这个

    ;WITH CTE(ColA)
    AS
    (
    SELECT 'a.b.c.d.e'      UNION ALL
    SELECT 'ab.cd.ef'       UNION ALL
    SELECT 'a1.b2.c3.d4.e5'
    )
    SELECT ColA,REVERSE(SUBSTRING(ReqColA,0,CHARINDEX('.',(ColA)))) AS ReqColA
      FROM
    (
    SELECT ColA ,SUBSTRING(REVERSE(ColA),CHARINDEX('.',REVERSE(ColA))+1,LEN(REVERSE(ColA))) AS ReqColA  FROM CTE
    )dt
    

    结果

    ColA            ReqColA
    -----------------------
    a.b.c.d.e       d
    ab.cd.ef        cd
    a1.b2.c3.d4.e5  d4
    

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多