我如何选择
换句话说,我正在寻找一种方法在第二个后缀之后提取最后一个部分,但如果我有第二个后缀 - 那么默认
感谢您的建议
答案 0 :(得分:2)
试试这样:
首先你"分裂"带有XML技巧的减号上的字符串。 然后你从XML读取第三个节点 - 瞧!
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;
结果
ALT1
SW
default
通过这种方式也可以让您有机会一次性查询其他部分,只需查询/x[1]
和/x[2]
答案 1 :(得分:1)
我是使用内置的substring()
函数完成的:
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
答案 2 :(得分:1)
为了获得最佳性能,您可以使用此单线程解决此问题(计算为一行)
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)
结果:
ALT1
ALT2
SW
Default
Default
答案 3 :(得分:0)
如果我了解您的要求,以下内容可满足您的需求:
-- 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
答案 4 :(得分:0)
使用可以使用CASE
表达式来检查字符串是否以W61N03D20V0-WHIH
开头
如果以它开头,请使用RIGHT
,REVERSE
和CHARINDEX
函数的组合来获取字符串的最后一部分,否则Default
。
<强>查询强>
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 强>