【问题标题】:SQL Where, LIKE , OR combination issue with Blank textBox空白文本框的 SQL Where、LIKE 或 OR 组合问题
【发布时间】:2025-12-04 02:05:02
【问题描述】:

我有以下查询

SELECT FullUrl
    ,Title
    ,NextWebGroupId
    ,TimeCreated
FROM AllWebsTest
WHERE (Title LIKE '%' + @Title + '%')
    OR (FullUrl LIKE '%' + @FullUrl + '%')

Title 和 FullURL 是 TextBox 的参数。

我的期望是,

  1. 如果我在标题文本框中输入文本并搜索,它不会给出任何结果,只有当我在 FullURL 文本框中输入一些字符串甚至空格时,才会得到结果。
  2. 反之亦然 - 如果标题为空白(也没有空格)并且我将搜索词放在 fullurl 文本框中,我没有得到任何结果。

我如何处理空白文本框,以便只有将搜索词放在其中一个框中才能返回结果。

如果我直接在 SQL 服务器中查询,这很好用。但是通过asp.net webform,它给出的问题。

Update1:​​我尝试了以下解决方案,虽然从逻辑上讲它应该可以工作,但如果其中一个文本框未被触及,我仍然没有得到结果。特殊字符会有问题吗?下面是确切的标签

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>" SelectCommand="SELECT FullUrl, Title, NextWebGroupId, TimeCreated FROM AllWebsTest WHERE (Title LIKE '%' + ISNULL(@Title, '') + '%') OR (FullUrl LIKE '%' + ISNULL(@FullUrl, '') + '%')">
            <SelectParameters>
                <asp:ControlParameter ControlID="txtSearch" Name="Title" PropertyName="Text" Type="String" />
                <asp:ControlParameter ControlID="Textsearch2" Name="FullUrl" PropertyName="Text" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>

【问题讨论】:

  • 尝试使用 SQL Server Profiler 来准确查看从应用程序发送并在服务器上执行的查询。然后,如果需要,我们可以从中回溯并进行更正..
  • 我最终把查询是 aspx.cs 文件而不是直接
  • 不客气,感谢您告知我们您的最终解决方案。

标签: sql asp.net sql-server


【解决方案1】:

试试这个查询:

SELECT FullUrl
    ,Title
    ,NextWebGroupId
    ,TimeCreated
FROM AllWebsTest
WHERE (Title LIKE '%' + ISNULL(@Title, '') + '%')
    AND (FullUrl LIKE '%' + ISNULL(@FullUrl, '') + '%')

查看此SQLFiddle 并确认此行为符合您的预期。

仅当将值传递给您的变量@title@fullURL 时,此查询才会过滤行(并返回与条件匹配的那些)。否则它将返回所有结果。

在您最近的 cmets 之后更新:

SELECT FullUrl
    ,Title
    ,NextWebGroupId
    ,TimeCreated
FROM AllWebsTest
WHERE (Title LIKE '%' + ISNULL(LTRIM(@Title), '') + '%')
    AND (FullUrl LIKE '%' + ISNULL(LTRIM(@FullUrl), '') + '%')

这是一个SQLFiddle,上面的代码是如何工作的。

【讨论】:

  • 试过了,但仍然没有单框搜索词的结果。请查看更新后的问题。
  • @Rohit 这个完全相同的查询?在WHERE 子句的两个条件之间使用AND 而不是OR
  • 是的..这正是预期的行为。但是如果两个框中的文本都匹配,则放置 AND 正在执行 AND,则返回结果,否则为空白。真的不确定,为什么它不适合我。它适用于单个文本框
  • OR 位于WHERE 子句的两个条件之间相反,AND 将在您为两个变量指定值时使其正常工作。但是将ISNULL 应用于变量也会为查询生成OR 效果,因此您不会丢失这种情况。
  • 我想我可能已经找到了问题,所以文本框返回空字符串,我们正在检查空值。甚至用空字符串测试了你的小提琴,但它不起作用。与上述要求相同,但字符串为空。是否有任何单一的语句来处理所有组合?
【解决方案2】:

很可能在此过程中使用NULL 而不是空字符串,从而导致WHERE Title LIKE NULL 失败。请尝试以下方法,明确检查 null 情况:

SELECT FullUrl, Title, NextWebGroupId, TimeCreated
FROM AllWebsTest 
WHERE (@Title IS NULL OR Title LIKE '%' + @Title + '%')
OR (@FullUrl IS NULL OR FullUrl LIKE '%' +  @FullUrl + '%')

【讨论】:

  • 我不确定这是否会过滤任何内容,因为如果您不将值传递给两个变量之一,假设您只传递了 @title 的值,那么 OR (@FullURL IS NULL OR ... )将始终为真,因此返回所有行(example here
【解决方案3】:

尝试检查标题,如果传递的字符串为空或空。

SELECT FullUrl
    ,Title
    ,NextWebGroupId
    ,TimeCreated
FROM AllWebsTest
WHERE ( ISNULL(@Title,'') != '' AND Title LIKE '%' + @Title + '%')
    OR (ISNULL(@FullUrl,'') != '' AND FullUrl LIKE '%' + @FullUrl + '%')

【讨论】:

    【解决方案4】:

    试试这个

    Create proc search
     @Title varchar(20) = null,
    @FullUrl varchar(20)=  null, 
    as
    begin
     SELECT FullUrl
        ,Title
        ,NextWebGroupId
        ,TimeCreated
    FROM AllWebsTest
    WHERE (@Title = null or Title LIKE '%' + @Title + '%')
        OR (@FullUrl = null or FullUrl LIKE '%' + @FullUrl + '%') 
    end
    

    【讨论】: