仅使用填充的文本框执行搜索

Posted

技术标签:

【中文标题】仅使用填充的文本框执行搜索【英文标题】:Perform search with filled textboxes only 【发布时间】:2019-05-27 11:52:22 【问题描述】:

我有一个带有不同搜索选项的搜索栏,我希望 SQL 查询只搜索填充的文本框

当我使用 if 语句(不是最佳实践)有一个只有两个搜索选项(名称和代码)的搜索栏时,我制作了一个简单的 SP,它运行良好。然而,现在我有 4-5 个元素的搜索 bbar,IF 语句似乎不是性能的最佳实践

这是我为只有 2 个搜索选项的情况所做的程序:

@Code_client nvarchar(50),
@Intitule_client varchar(100)
as 
IF (@Code_client is not NULL AND @Code_client!='')
   BEGIN
   IF (@Intitule_client IS not NULL AND @Intitule_client!='')
      select * from Clients where Code_client=@Code_client and Intitule_client=@Intitule_client
   ELSE
      select * from Clients where Code_client=@Code_client
   END
ELSE IF (@Intitule_client is not null AND @Intitule_client!='')
    BEGIN
    select * from Clients where Intitule_client=@Intitule_client
    END

但对于这种情况,我有 4 个这样的搜索选项:

<div id="chercher_employe" class="Rechercher">
                <ul>
                    <li>
                        <asp:TextBox runat="server" ID="chercher_employe_Nom" CssClass="Input" placeholder="Nom employe"></asp:TextBox>
                    </li>

                    <li>
                        <asp:TextBox runat="server" ID="chercher_employe_Departement" CssClass="Input" placeholder="Departement"></asp:TextBox>
                    </li>

                    <li>
                        <asp:TextBox runat="server" ID="chercher_employe_occupation" CssClass="Input" placeholder="Occupation"></asp:TextBox>
                    </li>

                    <li>
                        <asp:TextBox runat="server" ID="chercher_employe_IntituleProfil" CssClass="Input" placeholder="Profil"></asp:TextBox>
                    </li>

                    <li>
                        <asp:LinkButton runat="server" CssClass="button">  <i class="fas fa-search"></i> </asp:LinkButton>
                    </li>
                </ul>
            </div>

除了在 C# 或 SQL 中使用 if 语句外,我想不出其他方法,请问有什么建议吗?

【问题讨论】:

你可以有一个文本框的集合,然后选择所有!string.isnullorempty,然后为每一个执行适当的查询,或者如果你发送一个sproc,则将它们合并 select * from Clients where (Code_client=@Code_client or @Code_client is null) and (Intitule_client=@Intitule_client or @Intitule_client is null) and... 对于初学者this,有多种方法可以使用静态 SQL 执行此操作。不过,这篇文章的其余部分也值得一读,因为像这样的动态查询需要考虑一些性能缺陷。 我建议看看kitchen sink queries 和Catch-all queries。动态 SQL 可能是要走的路,但如果这个逻辑是从应用程序端控制的,那么您只需要适当地构建您的 SQL 语句,并且不要包含参数没有值的子句。 【参考方案1】:

if 语句只不过是一个逻辑含义

a -&gt; b如果a那么b

也可以写成

!a or b 不是 a 或 b

所以你的 if 语句

IF (@Intitule_client IS not NULL AND @Intitule_client!='')
      select * from Clients where Code_client=@Code_client and Intitule_client=@Intitule_client

可以翻译为(使用德摩根定律简化双重否定 (not(a or b) &lt;=&gt; not(a) and not(b))

SELECT * 
FROM Clients
WHERE (@Intitule_client IS NULL OR @Intitule_client = '' OR Intitule_client = @Intitule_client) AND Code_client = @Code_client

然后您可以使用此模式构建更复杂的查询。

【讨论】:

小心,因为这可能会导致一些糟糕的缓存查询计划。【参考方案2】:

@Larnu 和@jarlh 命题对我最有效。 这个链接解释得很好: https://blogs.sentryone.com/aaronbertrand/backtobasics-updated-kitchen-sink-example/

谢谢大家的回答,不胜感激:)

(请把你的答案写在这里,如果有人遇到同样的问题,我可以接受^^)

【讨论】:

以上是关于仅使用填充的文本框执行搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 Tampermonkey 中使用 javascript 进行页面搜索和文本框自动填充

使用最少代码从 SQL 数据库行填充文本框

通过表单事件过程中的函数填充访问文本框

在 jQuery 中填充文本框时执行 javascript 函数?

从 MySQL 数据库填充文本框/下拉列表

怎样用jquery实现新闻无闪动刷新,用js中工具箱2到3个控件,搜索文本框自动文本框自动填充完成