简体   繁体   中英

SQL Server 2012 - Using REPLACE + Regex in a SELECT column to format the value

I have a table containing values like this:

+----+------------------------------------------------+
| ID |                   AssignedTo                   |
+----+------------------------------------------------+
|  1 | 92;#Alex Smith;#114;#Joe Day;#184;#Johnny Bone |
+----+------------------------------------------------+

And I would like to remove the "[number];#" and replace it for a single dash "-" for every occurrence

+----+------------------------------------+
| ID |             AssignedTo             |
+----+------------------------------------+
|  1 | Alex Smith - Joe Day - Johnny Bone |
+----+------------------------------------+

Is this possible with default SQL Server 2012 functions?

Thanks!

You can use PATINDEX and stuff for doing this... but I am still not looking for options without looping...

DECLARE @var varchar(100) = '92;#Alex Smith;#114;#Joe Day;#184;#Johnny Bone'

WHILE (PATINDEX('%[0-9]%', @var) > 0)
BEGIN
    SELECT
    @var = STUFF(@var, PATINDEX('%[0-9]%', @var), 1, '')
END

SELECT REPLACE(REPLACE(@var, ';#;#', ' - '), ';#', '')

If the names will never have numbers in them, you could do:

SELECT final.AssignedTo
FROM Tab t
     CROSS APPLY (SELECT REPLACE(t.AssignedTo, '0', '') AS AssignedTo) r0
     CROSS APPLY (SELECT REPLACE(r0.AssignedTo, '1', '') AS AssignedTo) r1
     CROSS APPLY (SELECT REPLACE(r1.AssignedTo, '2', '') AS AssignedTo) r2
     CROSS APPLY (SELECT REPLACE(r2.AssignedTo, '3', '') AS AssignedTo) r3
     CROSS APPLY (SELECT REPLACE(r3.AssignedTo, '4', '') AS AssignedTo) r4
     CROSS APPLY (SELECT REPLACE(r4.AssignedTo, '5', '') AS AssignedTo) r5
     CROSS APPLY (SELECT REPLACE(r5.AssignedTo, '6', '') AS AssignedTo) r6
     CROSS APPLY (SELECT REPLACE(r6.AssignedTo, '7', '') AS AssignedTo) r7
     CROSS APPLY (SELECT REPLACE(r7.AssignedTo, '8', '') AS AssignedTo) r8
     CROSS APPLY (SELECT REPLACE(r8.AssignedTo, '9', '') AS AssignedTo) r9
     CROSS APPLY (SELECT REPLACE(r9.AssignedTo, ';#;#', ' - ') AS AssignedTo) sep
     CROSS APPLY (SELECT REPLACE(sep.AssignedTo, ';#', '') AS AssignedTo) final

The CROSS APPLY s just cleanup the nested REPLACE s. You could also just do REPLACE(REPLACE(REPLACE(...), '1', ''), '2', '')...)';#', '') .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM