帮助! - SQL - IF Else IF 逻辑用于返回 Containstable 选择

Posted

技术标签:

【中文标题】帮助! - SQL - IF Else IF 逻辑用于返回 Containstable 选择【英文标题】:Help! - SQL - IF Else IF logic for returning Containstable selection 【发布时间】:2009-02-25 18:48:10 【问题描述】:

我正在尝试在 SQL 的内联表值函数中使用 IF else If 逻辑,并根据该逻辑返回一个包含表。但我遇到了 IF Else IF 块的语法问题。谢谢您的帮助。因为我无法对包含表中的列进行参数化,所以我不得不求助于使用 if else 语句。这是代码。谢谢。

我来了

消息 156,级别 15,状态 1,过程全文搜索,第 17 行 关键字“IF”附近的语法不正确。

ALTER FUNCTION [dbo].[FullTextSearch] 
(       
    @Columns nvarchar(100), @SearchPhrase nvarchar(100)
)

RETURNS TABLE 
AS    
RETURN 


IF (@Columns='Title')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, Title, @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Project_Details')
   BEGIN
   SELECT * 
    from projects as P inner join
    containstable(PROJECTS, Project_Details, @SearchPhrase) as K 
    on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Contact_Info')
   BEGIN
   SELECT * 
    from projects as P inner join
    containstable(PROJECTS, Contact_Info, @SearchPhrase) as K 
    on P.project_id = K.[KEY]
   END

ELSE IF (@Columns='Project_Description')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, Project_Description, @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

ELSE -- (@Columns='All')
   BEGIN
   SELECT * 
        from projects as P inner join
        containstable(PROJECTS, (Title, Project_Details, Contact_Info,     Project_Description), @SearchPhrase) as K 
        on P.project_id = K.[KEY]
   END

【问题讨论】:

我只是想知道你到底想用这个查询做什么。 我在 C# 上有一个带有 asp.net 的 LinqTOSQL 层的搜索界面,问题是,LINQ to SQL 很棒,但它不支持全文搜索功能,所以除了程序别无他法或使用表值函数。我已经阅读了有关使用包装器/扩展的信息,但决定这样做。 因此您正在尝试在字段中搜索字符串。你知道它可能在哪些领域,或者可能是所有领域吗? 这是基于用户选择的动态。它可以是单个字段或所有字段。我可以创建函数并运行它,如果我没有那些 IF Else 语句,但我试图最小化资源而不是每次都选择所有。有没有办法对包含表中的列进行参数化? 我不确定,因为我以前从未使用过它 【参考方案1】:

您收到此错误是因为您尝试在内联表值函数中使用多个语句。

内联表值函数必须包含单个 SELECT 语句,类似于:

CREATE FUNCTION dbo.MyInlineFunction (@MyParam INT)
RETURNS TABLE
AS
RETURN 
(
    SELECT first_column, second_column FROM ...
)

你的函数需要声明为多语句函数,语法类似这样:

CREATE FUNCTION dbo.MyMultiStatementFunction (@MyParam INT)
RETURNS @MyTable TABLE 
(
    first_column INT, second_column VARCHAR(100)  -- etc
)
AS
BEGIN
    IF (@MyParam = 1)
        INSERT INTO @MyTable (...)
        SELECT ... FROM ...
    ELSE
        INSERT INTO @MyTable (...)
        SELECT ... FROM ...

    RETURN
END

【讨论】:

【参考方案2】:

查看sql management studio的多语句函数模板,即在菜单:View->Template Explorer-Create Multi-Statement Table-valued Function。

问题是多语句函数的语法不同。另请注意,正如 jmein 所说,第一个 if 有一个 ==。

【讨论】:

他修复了 = 问题,但我认为没有帮助 是的,因为真正的问题是多语句表值函数的语法不同 谢谢大家,我现在正在查看语法模板。【参考方案3】:

首先,你在第一个 IF 上有 == 而不是 =

哦,是的,我注意到在 ELSE 的 CONTAINSTABLE 参数中,您的 ProjectDetails 列出了两次

如果您正在搜索特定字段,是否可以使用以下语法:

WHERE Title LIKE '%'+ @Search +'%'
      OR ProjectDetails LIKE '%' + @Search + '%'
      OR ContactInfo LIKE '%' + @Search + '%')

(警告)此语法忽略任何索引。

您可以查看此blog 以获取适用于索引的解决方案。似乎有一个很好的解决方案。

【讨论】:

对不起,我把它放在那里是为了测试,我在粘贴代码时忘记把它改回来。它固定为单个“=”对不起,我的 SQL 充其量是新手。 LINQtoSQL 很棒,因为您可以编写 context.contains(field, "search text") 并且它会在 SQL 端将其转换为 LIKE。问题是 Like 没有充分利用 SQL 的全文搜索,如果你有索引的话,这会非常快。使用 Like 对我来说不是一个选项。 我已经使用 LIKE 实现了,但是与使用全文搜索相比,通过在多个字段上包含数百万条记录的表需要更长的时间。 啊,我觉得嗯,听起来很艰难 您是否注意到我提到 ProjectDetails 在您的 else 中列出了两次

以上是关于帮助! - SQL - IF Else IF 逻辑用于返回 Containstable 选择的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 SQL 中使用 if-then-else 逻辑吗? [复制]

如何在 SQL 中编写 if else if 条件 |甲骨文 |

在 Spring Boot 中,如何干掉 if else!

如何优化这段if else多层嵌套?

使用 else if 逻辑将条件列添加到 Pandas 数据框 - Python

sql中if then的使用