我在 sql 中有一个表,其中有一个名为 [message] 的列。我需要使用 UDF 来填充 1 或 0,具体取决于该子字符串是否包含“LHL”。
我的代码:
create function dbo.generate
(
@result varchar(max)
)
returns int
as
begin
declare @message varchar(max) = (Select [message] from POST)
if (PATINDEX('%LHL%', @message) > 0)
begin
set @result = '1'
end
else
set @result = '0'
return @result
end
go
select dbo.generate('%LHL%')
有了这个我得到错误:
消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。
我只需要一个包含 0 和 1 的列表。我可以使用 PATINDEX 生成一个列表,该列表可以告诉我 LHL 的开始位置,但似乎无法将数字更改为 1(如果存在),如图所示。(也必须使用 UDF 而不是 CTE)
with cte as
(select [message] from POSt
),
pos as
(select patindex('%LHL%',[message]) pos, [message] from cte
union all
select pos+patindex('%LHL%',substring([message], pos+1, len([message]))) pos, [message] from pos
where patindex('%LHL%',substring([message], pos+1, len([message])))>0
)
select pos from pos