我在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%')
有了这个,我得到了错误:
Msg 512,Level 16,State 1,Line 1 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
我只需要一个包含0&1和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
答案 0 :(得分:2)
为什么不使用EXISTS子句来检查是否存在行?
IF(EXISTS(Select [message] from POST WHERE [message] LIKE '%LHL%'))
BEGIN
SET @result = '1'
END
ELSE
BEGIN
SET @result = '0'
END
RETURN @result
根据您想要达到的目标(即检查是否存在LHL),这是最佳选择。但是,如果您希望所有位置通过将其作为字符串首先将整个列数据转换为字符串然后进行搜索。
答案 1 :(得分:1)
用于设置变量@message值的SELECT语句declare @message varchar(max) = (Select [message] from POST)
返回多个值。限制SELECT语句一次只返回一个值,以便它可以存储在' @ message'变量