I have this:
21654-8012
1234-127834
12345-1222
I want to extract this:
21654
1234
12345
Basically, everything before the hyphen, - character. Does anyone have any suggestions on where to start?
Use left WITH charindex() :
select t.col, left(col, charindex('-', col)-1)
from table t;
You can use CHARINDEX function
DECLARE #text VARCHAR(20)
SET #text = '123456-0000'
SELECT SUBSTRING(#text, 0, CHARINDEX('-', #text))
Instead of #text, you can use your field name
SELECT SUBSTRING(YOUR_COLUMN_NAME, 0, CHARINDEX('-', YOUR_COLUMN_NAME)) FROM YOUR_TABLE_NAME
Related
I have a view where I would like to create a column that isolates a string between 3 of the same character ("-"). So for example, I want AC-RBQ/4110-WS-L1 to become RBQ/4110.
So far I have tried this and it gets me very close.
SELECT SUBSTRING(locnum,CHARINDEX('-',locnum)+1,(((LEN(locnum))-CHARINDEX('-', REVERSE(locnum)))-CHARINDEX('-',locnum))) AS Result
Result:
RBQ/4110-WS
RBQ/4110-CS
I just need to remove that last "-WS" or "-CS"
Any thoughts or ideas would be greatly appreciated!
If the pattern is consistent, perhaps parsename() would be a good fit here
Example
Declare #S varchar(100) = 'AC-RBQ/4110-WS-L1'
Select parsename(replace(#S,'-','.'),3)
Returns
RBQ/4110
EDIT -
Just in case your data is more variable, you can use XML to extract the SECOND value
Example
Declare #YourTable table (locnum varchar(100))
Insert Into #YourTable values
('AC-RBQ/4110-WS-L1')
Select NewValue = convert(xml,'<x>'+replace(locnum,'-','</x><x>')+'</x>').value('/x[2]','varchar(100)')
From #YourTable
Returns
NewValue
RBQ/4110
It would seem simpler to split the value and then extract the 2nd item from your data. If your data always has 4 elements (and you always need the second), you could use PARSENAME:
SELECT PN.P
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
CROSS APPLY (VALUES(PARSENAME(REPLACE(V.S,'-','.'),3)))PN(P); --Part 3 as PARSENAME works right to left
Otherwise you could use a splitter like delimitedsplit8k_lead:
SELECT DS.Item
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
CROSS APPLY dbo.DelimitedSplit8K_lead(V.S,'-') DS
WHERE DS.ItemNumber = 2;
Please Try below Query. If your pattern is same per your question then below will work.
select left(SUBSTRING('AC-RBQ/4110-WS-L1', charindex('-','AC-RBQ/4110-WS-L1') + 1, LEN('AC-RBQ/4110-WS-L1')),8)
WITH TEMP AS
(
SELECT 'AC-RBQ/4110-WS-L1' AS COL
)
SELECT * ,
CHARINDEX('-', [COL]) AS FR,
CHARINDEX('-', [COL],CHARINDEX('-', [COL])+1) AS FR2,
SUBSTRING([COL], CHARINDEX('-', [COL]) +1 ,CHARINDEX('-', [COL],CHARINDEX('-
', [COL])+1) - (CHARINDEX('-', [COL]) +1) ) AS RESULT
FROM TEMP
You've done most of the work and you need to get the left part of the result up to -:
SELECT
LEFT(SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
(((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum))),
CHARINDEX('-', SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
(((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum)))) - 1) AS Result
I need to select everything in a string column after the [. Issue is there are multiple [ in the string, which doesn't matter - I want to select everything after the 1st one.
I've tried several variances to try and get it to work but I can't.
RIGHT([Column 0], CHARINDEX('[', REVERSE([Column 0])) - 1)
You need to use substring function also like below.
declare #str varchar(max)='some data[this is also some data[testing[hello[hi'
select substring(#str,charindex('[',#str,0)+1,len(#str))
OUTPUT
this is also some data[testing[hello[hi
Declare #S VARCHAR(100) = 'abc[123[1]222]'
Select SUBSTRING( #S
, CHARINDEX('[', #S) +1
, LEN(#S)
)
Result:
123[1]222]
Maybe next will do:
select substring([Column 0], charindex('[', [Column 0]) + 1, len([Column 0]))
Try this one.hope this will work for you.
How I can select
"ALT1" if value is "W61N03D20V0-WHIH-ALT1"
"ALT2" if for "W61N03D20V0-WHIH-ALT2"
"SW" for "W61N03D20V0-WHIH-SW"
"Default" for "W61N26D1YA1-VICU" (without prefix)
"Defailt" for "W61N27D21V2-AZTD"
In other words I'm looking for a way extract last part after second suffix, but if I have't second suffix - then default
Thanks for advice
Try it like this:
First you "split" the string on its minus signs with the XML trick.
Then you read the third node from you XML - voila!
CREATE TABLE #tbl(content VARCHAR(100));
INSERT INTO #tbl VALUES('W61N03D20V0-WHIH-ALT1')
,('W61N03D20V0-WHIH-SW')
,('W61N26D1YA1-VICU');
WITH SplittedAsXml AS
(
SELECT CAST('<x>' + REPLACE(content,'-','</x><x>') + '</x>' AS XML) AS Content
FROM #tbl
)
SELECT ISNULL(Content.value('/x[3]','varchar(max)'),'default') AS TheThirdPart
FROM SplittedAsXml;
DROP TABLE #tbl;
The result
ALT1
SW
default
Going this ways would also give you the chance to get the other parts in one go just querying /x[1] and /x[2] too
I did it using the built-in substring() function:
declare #str VARCHAR(40) = 'W61N03D20V0-WHIH-ALT1' -- also works for the other examples
declare #sep VARCHAR(1) = '-'
declare #middleToEnd VARCHAR(40) = substring(#str, charindex(#sep, #str) + 1, len(#str))
declare #pos INT = charindex(#sep, #middleToEnd)
declare #lastPart VARCHAR(40) =
CASE WHEN #pos = 0
THEN 'Default'
ELSE substring(#middleToEnd, #pos + 1, len(#middleToEnd))
END
select #lastPart
For best performance, you can solve it with this one-liner(calculation is one line)
SELECT
COALESCE(STUFF(col,1,NULLIF(CHARINDEX('-',col, CHARINDEX('-',col)+1), 0),''),'Default')
FROM (values
('W61N03D20V0-WHIH-ALT1'),('W61N03D20V0-WHIH-ALT2'),
('W61N03D20V0-WHIH-SW'),('W61N26D1YA1-VICU'),
('W61N27D21V2-AZTD')) x(col)
Result:
ALT1
ALT2
SW
Default
Default
If I understand what you are asking for, the following does what you need:
-- fake table
WITH SomeTable AS (
SELECT 'W61N03D20V0-WHIH-ALT1' AS Field1
UNION ALL
SELECT 'W61N03D20V0-WHIH-SW'
UNION ALL
SELECT 'W61N26D1YA1-VICU'
)
-- select
SELECT
CASE CHARINDEX('-WHIH-', Field1)
WHEN 0 THEN 'Default'
ELSE SUBSTRING(Field1, CHARINDEX('-WHIH-', Field1) + 6, LEN(Field1) - (CHARINDEX('-WHIH-', Field1) + 5))
END
FROM SomeTable
Use can use a CASE expression to check whether the string starts with W61N03D20V0-WHIH.
If it starts with it use a combination of RIGHT, REVERSE and CHARINDEX functions to get last part from the string, else Default.
Query
select case when [your_column_name] like 'W61N03D20V0-WHIH%'
then right([your_column_name], charindex('-', reverse([your_column_name]), 1) - 1)
else 'Default' end as new_column_name
from your_table_name;
SQl Fiddle demo
I want to remove the substring before last occurrence of period(.). The Query should convert r.k.Lee Brown to Lee Brown. So, basically I need the substring before last dot . and replace it with ''.
Try this:
SELECT RIGHT(#str, CHARINDEX('.', REVERSE(#str)) - 1)
You can slightly modify the above using:
REVERSE('.' + #str))
instead of
REVERSE(#str)
just in case there are no '.' in #str.
Use REVERSE and Substring Function:
DECLARE #var VARCHAR(50) = 'r.k.Lee Brown'
SELECT Reverse(Substring(Reverse(#var), 0, Charindex('.', Reverse(#var))))
Like This
declare #a as nvarchar(100)='r.k.Lee Brown'
select reverse(substring(reverse(#a),0,charindex('.',reverse(#a))))
EDIT:
If you have no '.' in string
declare #a as nvarchar(100)='r.k.Lee Brown'
select reverse(substring(reverse(#a),0,charindex('.',reverse('.'+#a))))
set #a = 'Lee Brown'
select reverse(substring(reverse(#a),0,charindex('.',reverse('.'+#a))))
I use the following, but is there any easy way for doing this ?
DECLARE #x VARCHAR(32) = 'uk,usa,germany,poland,';
SELECT SUBSTRING(#x,0, LEN(#x) - CHARINDEX(',', REVERSE(#x)) + 1);
the output is :
uk,usa,germany,poland
Thanks a lot.
select left(#x, len(#x) - 1)
Note that LEN does not include trailing spaces.
In order to avoid errors on empty strings, I suggest using SUBSTRING starting from character position 0 instead of LEFT. Using left with my test data would fail.
DECLARE #t table(col1 varchar(20))
INSERT #t values('abc,'),(''), ('Denmark,')
SELECT
SUBSTRING(col1, 0, len(col1))
FROM #t
Result:
abc
<empty row>
Denmark
Try this using STUFF:
DECLARE #x VARCHAR(32) = 'uk,usa,germany,poland,';
select STUFF(#x,LEN(#x),1,' ')