• Some more tricks using CTE and recursivity...

    1) How to split a string into words ?

    [font="Courier New"]-- here is the table :

    CREATE TABLE TRolePers

    (

    idPers int,

    Role varchar(50)

    )

    -- containing:

    INSERT INTO TRolePers VALUES (1, 'RespX, RespY')

    INSERT INTO TRolePers VALUES (2, 'Admin')

    INSERT INTO TRolePers VALUES (3, 'RespX, RespZ, RespY')

    /*

    Find the query that can split the sentence into the columns, every words been delimited par the comma.

    How to obtain such a result ?

    idPers Role

    ----------- --------------------------------------------------

    1 RespX

    1 RespY

    2 Admin

    3 RespX

    3 respY

    3 RespZ

    */

    -- solution :

    WITH T

    AS

    (

    SELECT idPers,

    CASE

    WHEN CHARINDEX(',', Role) > 0 THEN LTRIM(SUBSTRING(Role, 1, CHARINDEX(',', Role) - 1))

    ELSE Role

    END AS UnRole,

    LTRIM(SUBSTRING(Role, CHARINDEX(',', Role) + 1, LEN(Role) - CHARINDEX(',', Role))) AS LesAutresRoles

    FROM TRolePers

    UNION ALL

    SELECT RP.idPers,

    CASE

    WHEN CHARINDEX(',', LesAutresRoles) > 0 THEN LTRIM(SUBSTRING(LesAutresRoles, 1, CHARINDEX(',', LesAutresRoles) - 1))

    ELSE LesAutresRoles

    END,

    CASE

    WHEN CHARINDEX(',', LesAutresRoles) > 0 THEN LTRIM(SUBSTRING(LesAutresRoles, CHARINDEX(',', LesAutresRoles) + 1, LEN(LesAutresRoles) - CHARINDEX(',',

    LesAutresRoles)))

    ELSE NULL

    END

    FROM TRolePers RP

    INNER JOIN T

    ON T.idPers = RP.idPers

    WHERE LesAutresRoles IS NOT NULL

    )

    SELECT DISTINCT idPers, UnRole As Role

    FROM T

    ORDER BY 1, 2

    /*

    idPers Role

    ----------- --------------------------------------------------

    1 RespX

    1 RespY

    2 Admin

    3 RespX

    3 respY

    3 RespZ

    (6 ligne(s) affectée(s))

    */[/font]

    2) how to concatenate words to obtain sentences

    [font="Courier New"]-- Here is a table :

    CREATE TABLE T_PHRASE_PHR

    (PHR_ID INTEGER NOT NULL,

    PHR_MOT_POSITION INTEGER NOT NULL,

    PHR_MOT VARCHAR(32) NOT NULL,

    CONSTRAINT PK_PHR PRIMARY KEY (PHR_ID, PHR_MOT_POSITION));

    -- containing :

    INSERT INTO T_PHRASE_PHR VALUES (1, 1, 'Le')

    INSERT INTO T_PHRASE_PHR VALUES (1, 2, 'petit')

    INSERT INTO T_PHRASE_PHR VALUES (1, 3, 'chat')

    INSERT INTO T_PHRASE_PHR VALUES (1, 4, 'est')

    INSERT INTO T_PHRASE_PHR VALUES (1, 5, 'mort')

    INSERT INTO T_PHRASE_PHR VALUES (2, 1, 'Les')

    INSERT INTO T_PHRASE_PHR VALUES (2, 2, 'sanglots')

    INSERT INTO T_PHRASE_PHR VALUES (2, 3, 'longs')

    INSERT INTO T_PHRASE_PHR VALUES (2, 4, 'des')

    INSERT INTO T_PHRASE_PHR VALUES (2, 5, 'violons')

    INSERT INTO T_PHRASE_PHR VALUES (2, 6, 'de')

    INSERT INTO T_PHRASE_PHR VALUES (2, 7, 'l''')

    INSERT INTO T_PHRASE_PHR VALUES (2, 8, 'automne')

    INSERT INTO T_PHRASE_PHR VALUES (2, 9, 'blessent')

    INSERT INTO T_PHRASE_PHR VALUES (2, 10, 'mon')

    INSERT INTO T_PHRASE_PHR VALUES (2, 11, 'coeur')

    INSERT INTO T_PHRASE_PHR VALUES (2, 12, 'd''')

    INSERT INTO T_PHRASE_PHR VALUES (2, 13, 'une')

    INSERT INTO T_PHRASE_PHR VALUES (2, 14, 'langueur')

    INSERT INTO T_PHRASE_PHR VALUES (2, 15, 'monotone')

    /*

    Find a query that can retrieve the sentence by compounding the words in the column PHR_MOT_POSITION order.

    How to obtain such a result ?

    id PHRASE

    ----------- ------------------------------------------------------------------------------------------

    1 Le petit chat est mort.

    2 Les sanglots longs des violons de l'automne blessent mon coeur d'une langueur monotone.

    */

    -- solution

    WITH

    phrases (phrase, id, position)

    AS

    (

    SELECT CAST(PHR_MOT AS VARCHAR(max))

    + CASE

    WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''

    ELSE ' '

    END, PHR_ID, PHR_MOT_POSITION

    FROM T_PHRASE_PHR

    WHERE PHR_MOT_POSITION = 1

    UNION ALL

    SELECT phrase + CAST(PHR_MOT AS VARCHAR(max))

    + CASE

    WHEN SUBSTRING(PHR_MOT, LEN(PHR_MOT), 1) = '''' THEN ''

    ELSE ' '

    END AS PHRASE,

    PHR_ID, PHR_MOT_POSITION

    FROM T_PHRASE_PHR AS suiv

    INNER JOIN phrases

    ON suiv.PHR_ID = phrases.id

    AND suiv.PHR_MOT_POSITION = phrases.position + 1

    ),

    maxphrase

    AS

    (

    SELECT id, MAX(position) AS maxposition

    FROM phrases

    GROUP BY id

    )

    SELECT P.id, phrase + '.' AS PHRASE

    FROM phrases AS P

    INNER JOIN maxphrase AS M

    ON P.id = M.id

    AND P.position = M.maxposition

    ORDER BY id

    /*

    id PHRASE

    ----------- ------------------------------------------------------------------------------------------

    1 Le petit chat est mort.

    2 Les sanglots longs des violons de l'automne blessent mon coeur d'une langueur monotone.

    (2 ligne(s) affectée(s))

    */[/font]

    A +