我需要创建一个子查询(或视图)列,其中的值是从长字符串的一部分中提取的。值将如下所示:
"招聘人员:招聘人员姓名日期:......"
我需要在以下后选择招聘人员姓名:并以招聘人员姓名后面的空格结束。我知道规范化会更好,但在这种情况下我们只有查询访问权限而不是数据库设置权限。
赞赏的想法!
答案 0 :(得分:1)
您可以使用正则表达式。正则表达式将允许您表示您要搜索文本 Recruiter ,后跟冒号,空格和一系列字符后跟空格,并且您希望它提取这些字符。
表达式可能看起来有点像这样(未经测试)
Recruiter: (.+) Date:
这会查找'Recruiter:',然后是一串长度为1或更大(.
)的任何字符(+
),将被提取(括号),后跟文字字符串'Date:'。
如何在SQL中使用它取决于您的供应商。
答案 1 :(得分:0)
我会创建一个拉出给定键值的函数。您可以使用它:
select [dbo].[GetValue]('recruiter',
'aKey: the a value Recruiter: James Bond cKey: the c value')
这将返回'James Bond'
这是功能:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create function [dbo].[GetValue](@Key varchar(50), @Line varchar(max))
returns varchar(max)
as
begin
declare @posStart int, @posEnd int
select @posStart=charindex(@Key, @Line) -- the start of the key
if(@posStart = 0)
return '' -- key not found
set @posStart = @posStart + len(@Key) + 1 -- the start of the value
select @line = substring(@line, @posStart, 1000) -- start @Line at the value
select @posEnd=charindex(':', @line) -- find the next key
if(@posEnd > 0)
begin
-- shorten @line to next ":"
select @line = substring(@line, 0, @posEnd)
-- take off everything after the value
select @posEnd = charindex(' ', reverse(@line));
if(@posEnd > 0)
select @line = substring(@line, 0, len(@line) - @posEnd + 1)
end
return rtrim(ltrim(@line))
end
go