SQL Split from Multivalue

Handian Sudianto 4,956 Reputation points
2024-07-22T08:30:07.9066667+00:00

Hello

I have field contains like this

vd:07/21/2024 19:47:13 07/21/2024 19:43:21 07/21/2024 19:20:59 07/21/2024 19:03:13 07/21/2024 19:15:35 07/21/2024 19:08:38 07/21/2024 19:27:32 07/21/2024 19:24:04, vn:10_JKT01 09_JKT02 06_JKT03 01_JKT04 05_JKT05 02_JKT06 08_JKT07 07_JKT08, vr:Success Success Success Success Success Success Success Success

Actually that value contains 3 pairs, so the real value is

VD VN VR

07/21/2024 19:47:13 10_JKT01 Success

07/21/2024 19:43:21 10_JKT02 Success

07/21/2024 19:20:59 10_JKT03 Success

07/21/2024 19:03:13 10_JKT04 Success

07/21/2024 19:15:35 10_JKT05 Success

07/21/2024 19:08:38 10_JKT06 Success

07/21/2024 19:27:32 10_JKT07 Success

07/21/2024 19:24:04 10_JKT08 Success

How we can make SQL query to get VD and VR by VN? Example i want yo get VD and VR for 10_JKT06.

SQL Server
SQL Server
A family of Microsoft relational database management and analysis systems for e-commerce, line-of-business, and data warehousing solutions.
13,760 questions
{count} votes

Accepted answer
  1. Erland Sommarskog 110.8K Reputation points MVP
    2024-07-22T19:25:54.44+00:00

    This solution works on SQL 2022 and Azure SQL Database/Managed Instance:

    DECLARE @Handian nvarchar(MAX) = 'vd:07/21/2024 19:47:13 07/21/2024 19:43:21 07/21/2024 19:20:59 07/21/2024 19:03:13 07/21/2024 19:15:35 07/21/2024 19:08:38 07/21/2024 19:27:32 07/21/2024 19:24:04, vn:10_JKT01 09_JKT02 06_JKT03 01_JKT04 05_JKT05 02_JKT06 08_JKT07 07_JKT08, vr:Success Success Success Success Success Success Success Success'
    DECLARE @vd nvarchar(MAX),
             @vn nvarchar(MAX),
            @vr nvarchar(MAX)
    SELECT @vd = MIN(CASE ordinal WHEN 1 THEN ltrim(value) END),
           @vn = MIN(CASE ordinal WHEN 2 THEN ltrim(value) END),
           @vr = MIN(CASE ordinal WHEN 3 THEN ltrim(value) END)
    FROM   string_split(@Handian, ',', 1)
    SELECT @vd = substring(@vd, 4, len(@vd)),
           @vn = substring(@vn, 4, len(@vn)),
           @vr = substring(@vr, 4, len(@vr))
    DECLARE @values TABLE (id   int          NOT NULL,
                           vd   datetime2(0) NOT NULL,
                           vn   varchar(20)  NOT NULL,
                           vr   varchar(20)  NOT NULL)
    ; WITH vd AS (
       SELECT value, (ordinal+1)/2 AS ordinal
       FROM   string_split(@vd, ' ', 1)
    ), agg_vd AS (
       SELECT vd = string_agg(value, ' '), ordinal
       FROM   vd
       GROUP  BY ordinal
    )
    INSERT @values(id, vd, vn, vr)
       SELECT vd.ordinal, parse(vd.vd AS datetime2(0) USING 'en-us'), vn.value, vr.value
       FROM   agg_vd vd
       JOIN   string_split(@vn, ' ', 1) AS vn ON vd.ordinal = vn.ordinal
       JOIN   string_split(@vr, ' ', 1) AS vr ON vd.ordinal = vr.ordinal
    SELECT * FROM @values
    

    For older versions of SQL Server, see my article Arrays and Lists in SQL Server.

    0 comments No comments

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.