SQL Server - 获取字符串的不同部分

时间:2018-03-21 21:14:57

标签: sql sql-server

首先让我说这是一个我没有管理的数据库视图所以数据就是这样。它有一个职位名称列,其中还包括工作级别(例如软件工程师2,设计师C,空中交通管制员E-1等)我需要获得不同的职称。所有软件工程师(级别1到6)都应返回单个值。职称可以包含一个或多个单词。级别可以包含1到3个字符。我试过这个来获得等级

SELECT 
    jobtitle, 
    REVERSE(LEFT(REVERSE(jobtitle), CHARINDEX(' ', REVERSE(jobtitle)) - 1)) AS level

获得关卡,但我无法弄清楚如何从工作头衔中剥离,然后为这些获得明显的价值。

4 个答案:

答案 0 :(得分:1)

如果等级总是一个单词,你可以使用下面的单词去掉最后一个单词,这样你就得到了职位:

SELECT SUBSTRING(jobtitle, 1, LEN(jobtitle) - CHARINDEX(' ', REVERSE(jobtitle)))

或者如果您更喜欢使用LEFT而不是SUBSTRING:

SELECT LEFT(jobtitle,LEN(jobtitle)-CHARINDEX(' ', REVERSE(jobtitle),0)+1)

答案 1 :(得分:0)

如果您的等级始终是格式" 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列中,以及任何其他相关信息。然后在临时表上进行聚合。这将为您提供更多的分析自由,并且可能比尝试分离各个部分,然后在一个镜头中对子字符串执行明显的更好的性能。

答案 2 :(得分:0)

docker network ls

答案 3 :(得分:0)

使用apply运算符可以重复使用字符串中生成的位置进行后续计算。 e.g。

SQL Fiddle

MS SQL Server 2017架构设置

INSERT INTO USER (username, password, roles) 
VALUES('admin', '123', STRINGTOUTF8('ROLE_ADMIN'));

查询1

CREATE TABLE Table1
    ([jobtitle] varchar(50))
;

INSERT INTO Table1
    ([jobtitle])
VALUES
    (NULL),
    (''),
    ('nospacehere'),
    ('Software Engineer 2'),
    ('Designer C'),
    ('Air Traffic Controller E-1')
;

<强> Results

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)