0

我在 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
4

2 回答 2

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 是否存在),这是最佳选择。但是,如果您希望通过将所有位置设为字符串,首先将整个列数据转换为字符串,然后进行搜索。

于 2015-08-17T12:38:26.393 回答
1

用于为变量 @message 设置值的SELECT 语句declare @message varchar(max) = (Select [message] from POST)返回多个值。限制您的 SELECT 语句一次只返回一个值,以便它可以存储在“@message”变量中。

于 2015-08-17T06:52:33.283 回答