[英]SQL Server - get distinct part of string
首先,我要说这是我不管理的数据库视图,因此数据就是它。 它有一个职位标题列,其中还包含职位级别(例如,软件工程师2,设计师C,空中交通管制员E-1等),我需要获取不同的职位标题。 所有软件工程师(级别1至6)应返回一个值。 职位名称中可以包含一个或多个单词。 级别可以包含1到3个字符。 我试图这样做以获得水平
SELECT
jobtitle,
REVERSE(LEFT(REVERSE(jobtitle), CHARINDEX(' ', REVERSE(jobtitle)) - 1)) AS level
得到的水平,但我不知道如何剥离职称,然后为这些获得独特的价值。
如果level始终是一个单词,则可以使用以下命令去除最后一个单词,以便仅获得职位名称:
SELECT SUBSTRING(jobtitle, 1, LEN(jobtitle) - CHARINDEX(' ', REVERSE(jobtitle)))
或者,如果您更喜欢使用LEFT而不是SUBSTRING:
SELECT LEFT(jobtitle,LEN(jobtitle)-CHARINDEX(' ', REVERSE(jobtitle),0)+1)
如果您的级别始终为“ E-1”格式,或者仅为“ C”或“ A4”格式,则可以在完整职位中的最后一个空格上进行拆分。
尝试这个:
SELECT RIGHT(jobtitle, charindex(' ', reverse(jobtitle) + ' ') - 1)
正确的权利将为您提供水平。 要么:
SELECT LEFT(jobtitle, len(jobtitle) - charindex(' ', reverse(jobtitle) + ' '))
LEFT将为您获得标题。
我在寻找与C#string.LastIndexOf()方法等效的sql时遇到了这些问题。
如果关卡可以有一个空间,这将变得更加复杂。
您可能只想将这两个值以及其他任何相关信息拉入临时表的2列中。 然后在临时表上进行汇总。 与尝试将片段分开然后对子字符串进行不同的处理相比,这将为您提供更大的分析自由,并且可能会提供更好的性能。
select reverse(stuff(reverse([JOBTITLE]), 1, 3, '')) , Substring(reverse(stuff(([JOBTITLE]), 1, 3, '')),0,CHARINDEX(' ', reverse(stuff(([JOBTITLE]), 1, 3, ''))))
使用apply运算符可将字符串中生成的位置重新用于后续计算。 例如
MS SQL Server 2017架构设置 :
CREATE TABLE Table1
([jobtitle] varchar(50))
;
INSERT INTO Table1
([jobtitle])
VALUES
(NULL),
(''),
('nospacehere'),
('Software Engineer 2'),
('Designer C'),
('Air Traffic Controller E-1')
;
查询1 :
select
jobtitle
, left(jobtitle,a.pos)
, ltrim(substring(jobtitle,a.pos+1,50))
, a.pos
from table1
outer apply (
select len(jobtitle) - charindex(' ',reverse(jobtitle))
) a (pos)
结果 :
| jobtitle | | | pos |
|----------------------------|------------------------|--------|--------|
| (null) | (null) | (null) | (null) |
| | | | 0 |
| nospacehere | nospacehere | | 11 |
| Software Engineer 2 | Software Engineer | 2 | 17 |
| Designer C | Designer | C | 8 |
| Air Traffic Controller E-1 | Air Traffic Controller | E-1 | 22 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.