August 22, 2023 at 11:30 pm
Hello,
I am trying to extract Event Name from a long string that has some information not relevant for what I am doing at the very moment. I basically need to extract everything after 2nd '_' and before 3rd '_'.
So technically I need to get Bestseller and Promotion for the examples that I am showing in the picture.
I believe we usually can extract such things with SUBSTRING, but here the number of characters before and after is unknown.
SELECT rl_event_id
Extract value after 2nd '_' and stop before 3rd '_'
Please let me know if someone has ideas.
As for charindex function, I am not 100% sure how I can use it in this situation.
It gives me 0 or 16.
When I do it second time it just gives me 0s.
There must be another way to do it. I am not sure how I can approach it in a different way.
August 23, 2023 at 8:17 am
Here is a possibility.
You could so it all in a single (rather lengthy) expression, but I broke it out to help you understand how I did it.
Please provide consumable test data in future.
WITH SomeText
AS (SELECT t = 'AB123456_BlahBlah_BESTSELLER_blahBlah')
SELECT SomeText.t
,c1.t1
,c2.t2
,Ext = LEFT(c2.t2, CHARINDEX ('_', c2.t2) - 1)
FROM SomeText
CROSS APPLY
(SELECT t1 = STUFF (SomeText.t, 1, CHARINDEX ('_', SomeText.t), '')) c1
CROSS APPLY
(SELECT t2 = STUFF (c1.t1, 1, CHARINDEX ('_', c1.t1), '')) c2;
August 23, 2023 at 1:49 pm
Idea#1
Are these values known? It looks like there is a "fixed list" of possible values. If so, then you can skip parsing the string and do a like. The issue here is that the leading wildcards may be a performance issue.
CASE
WHEN String LIKE '%Bestseller%' THEN 'Bestseller'
WHEN String LIKE '%Promotion%' THEN 'Promotion'
Idea #2
Leverage Jeff Moden's string splitter HERE.
SELECT *
FROM [dbo].[DelimitedSplit8K] (
'ABC_123_XYZ_789'
,'_')
WHERE ItemNumber = 3
Michael L John
If you assassinate a DBA, would you pull a trigger?
To properly post on a forum:
http://www.sqlservercentral.com/articles/61537/
August 23, 2023 at 2:44 pm
I vote for using the splitter. For some reason, I'd forgotten that even existed when I posted earlier.
August 23, 2023 at 3:05 pm
I think CHARINDEXes might be somewhat more efficient here:
;WITH data AS (
SELECT rl_event_id = 'AB123456_BlahBlah_BESTSELLER_blahBlah'
)
SELECT rl_event_id, SUBSTRING(rl_event_id, pos_of_second_underscore + 1, pos_of_third_underscore - pos_of_second_underscore - 1)
FROM data
CROSS APPLY ( SELECT CHARINDEX('_', rl_event_id) ) AS ca1(pos_of_first_underscore)
CROSS APPLY ( SELECT CHARINDEX('_', rl_event_id, pos_of_first_underscore + 1) ) AS ca2(pos_of_second_underscore)
CROSS APPLY ( SELECT CHARINDEX('_', rl_event_id, pos_of_second_underscore + 1) ) AS ca3(pos_of_third_underscore)
SQL DBA,SQL Server MVP(07, 08, 09) "It's a dog-eat-dog world, and I'm wearing Milk-Bone underwear." "Norm", on "Cheers". Also from "Cheers", from "Carla": "You need to know 3 things about Tortelli men: Tortelli men draw women like flies; Tortelli men treat women like flies; Tortelli men's brains are in their flies".
Viewing 5 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy