Author |
Topic |
rajan.nithin
Starting Member
42 Posts |
Posted - 2014-12-17 : 07:55:38
|
I have a string 'ACDIPFJZ'In my table one of the column has data likePFAGABCDEFHJMPUYZKMLJCRPFMy requirement is that if the string in the column has any of the characters from 'ACDIPFJZ' , those characters have to be retained and the rest of the characters have to be removed.My output should be:PFAG -- PFA (G Eliminated)ABCDEFHJMPUYZ -- ACDPFJZ (B,E,H,M,U,Y Eliminated)KML -- No dataJC -- JCRPF -- PF (R Eliminated) |
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2014-12-17 : 09:28:23
|
quote: Originally posted by gbritton This worked for me:declare @t table (a varchar(20)) insert into @t values('PFAG '),('ABCDEFHJMPUYZ '),('KML '),('JC '),('RPF ')declare @s varchar(20) = 'ACDIPFJZ';with n1(n) as (select 1 from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) v(n)), n2(n) as (select 1 from n1, n1 n), n4(n) as (select 1 from n2, n2 n), n8(n) as (select 1 from n4, n4 n), N(n) as (select top (len(@s)) row_number() over(order by (select 1)) from n8)select a, d.x.value('.', 'nvarchar(20)') from @tcross apply ( select '' + substring(a,charindex(substring(@s, n, 1), a), 1) from N where charindex(substring(@s, n, 1), a) > 0 for xml path(''),type ) d(x)where d.x is not nullorder by a
|
|
|
ScottPletcher
Aged Yak Warrior
550 Posts |
Posted - 2014-12-17 : 12:20:10
|
If the data string is reasonably short -- no more than 30 bytes -- I'd skip the tally table and XML and do this directly:declare @table table (data varchar(20))insert into @table values('PFAG '),('ABCDEFHJMPUYZ '),('KML '),('JC '),('RPF ')DECLARE @string varchar(20) = '[ACDIPFJZ]';SELECT data AS original_data, CASE WHEN SUBSTRING(data, 01, 1) LIKE @string THEN SUBSTRING(data, 01, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 02, 1) LIKE @string THEN SUBSTRING(data, 02, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 03, 1) LIKE @string THEN SUBSTRING(data, 03, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 04, 1) LIKE @string THEN SUBSTRING(data, 04, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 05, 1) LIKE @string THEN SUBSTRING(data, 05, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 06, 1) LIKE @string THEN SUBSTRING(data, 06, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 07, 1) LIKE @string THEN SUBSTRING(data, 07, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 08, 1) LIKE @string THEN SUBSTRING(data, 08, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 09, 1) LIKE @string THEN SUBSTRING(data, 09, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 10, 1) LIKE @string THEN SUBSTRING(data, 10, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 11, 1) LIKE @string THEN SUBSTRING(data, 11, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 12, 1) LIKE @string THEN SUBSTRING(data, 12, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 13, 1) LIKE @string THEN SUBSTRING(data, 13, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 14, 1) LIKE @string THEN SUBSTRING(data, 14, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 15, 1) LIKE @string THEN SUBSTRING(data, 15, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 16, 1) LIKE @string THEN SUBSTRING(data, 16, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 17, 1) LIKE @string THEN SUBSTRING(data, 17, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 18, 1) LIKE @string THEN SUBSTRING(data, 18, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 19, 1) LIKE @string THEN SUBSTRING(data, 19, 1) ELSE '' END + CASE WHEN SUBSTRING(data, 20, 1) LIKE @string THEN SUBSTRING(data, 20, 1) ELSE '' END AS modified_dataFROM @table |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2014-12-17 : 14:08:43
|
yup. sometimes brute force is best! |
|
|
rajan.nithin
Starting Member
42 Posts |
Posted - 2014-12-18 : 01:09:29
|
Thanks a lot for the solutions !!! One of my friend came up with this solution :declare @ValidChars as varchar(13) = '%[^ACDIPFJZ]%';declare @TestString as varchar(20) = 'ABCDEFHJMPUYZ';while PatIndex(@ValidChars,@TestString) > 0 set @TestString = STUFF(@TestString, PatIndex(@ValidChars, @TestString),1,'')select @TestString; |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2014-12-18 : 09:13:58
|
I try to avoid loops and cursors like that. Usually they come with a performance penalty. |
|
|
ScottPletcher
Aged Yak Warrior
550 Posts |
Posted - 2014-12-18 : 11:40:18
|
Along with that, it's very difficult to include the WHILE loop in a SELECT :-). |
|
|
gbritton
Master Smack Fu Yak Hacker
2780 Posts |
Posted - 2014-12-18 : 11:50:46
|
No kidding. I think the use of the while loop would require the use of a cursor. double trouble! |
|
|
|
|
|