高效的写作条件

时间:2016-12-26 10:14:21

标签: sql sql-server sql-server-2008

用户有三个文本框名称,编号,电子邮件。用户可以在三个文本框中输入详细信息,也可以是两个或一个基于输入的数据有一个表'tblSample'。 ' tblSample'Name,Number,Email,Adress,Contact Number

例如,如果用户仅输入名称为' Sai Bharath'我应该显示表'tblSample' Where Name='Sai Bharath'中的所有详细信息。就像那个用户可以输入两个文本框或三个文本框一样,最好和最简单的方法是什么?

4 个答案:

答案 0 :(得分:0)

使用下面的代码是获得结果的最简单方法:

SELECT * FROM #tblSample
WHERE ( @name <> '' AND Name = @Name ) OR
  ( @number <> 0 AND Number = @number ) OR
  ( @email <> '' AND Email= @email) 

答案 1 :(得分:0)

您可以在SQL Server中使用use COALESCE()函数。您不需要在语句中使用IF- ElseCASE。以下是使用COALESCE函数的方法。

SELECT * FROM tblSample where Name= COALESCE(NULLIF(@Name, ''), Name) and Address= COALESCE(NULLIF(@Address, ''), Address) and Email= COALESCE(NULLIF(@Email, ''), Email) and [ContactNumber=
COALESCE(NULLIF(@ContactNumber, ''), ContactNumber)

SQL中的COALESCE函数返回其参数中的第一个非NULL表达式。例如,如果@Name等于null,则函数将返回Name,这将导致where语句中的Name = Name,如1 = 1,表示条件始终为true。

答案 2 :(得分:0)

我们可以检查条件是否只有变量/参数有值,否则我们可以通过检查null返回true,但如果没有任何变量有值,它将返回所有记录。如果我们有以下条件,我们可以通过添加强制变量条件来避免这种情况:

CREATE TABLE #tblSample(NAME VARCHAR(50),Number INT,Email VARCHAR(50))
INSERT INTO #tblSample VALUES 
('Tom', 001122, 'tom@test.com'),
('Usy', 001123, 'usy@test.com'),
('Nuse', 001124, 'nuse@test.com'),
('Tom', NULL, 'tom@test.com')

DECLARE @name VARCHAR(50) = 'Tom', @number INT, @email VARCHAR(50)

SELECT *
FROM #tblSample
WHERE 1 = 1
AND (@name IS NULL OR NAME = @name)
AND (@number IS NULL OR number = @number)
AND (@email IS NULL OR email = @email)

输出:

NAME    Number  Email
Tom     1122    tom@test.com
Tom     NULL    tom@test.com

答案 3 :(得分:0)

由于您正在谈论文本框,我想您有某种服务层可以从数据层调用您的过程。一种方法是使用Entity Framework和LINQ2SQL来生成过滤方案所需的最小查询。

一种可能的方法:

<% if params[:type] == "switch" %>
    var obj = $('.<%= params[:name] %> a:not(.label) #myonoffswitch:checkbox');
    <% if params[params[:name]] %>
        obj.prop('checked', false);
    <% else %>
        obj.prop('checked', true);
    <% end %>
<% elsif params[:type] == "checkbox" %>
    <% if params[params[:name]] %>
        $('.<%= params[:name] %> a:not(.label)').remove();
        $('.<%= params[:name] %>').prepend("<a data-remote='true' href='/update?name=<%= params[:name] %>&amp;<%= params[:name] %>=true&amp;type=checkbox'><i class='icon ion-android-checkbox-outline-blank' tabindex='0'></i></a>");
        $('.<%= params[:name] %> a:not(.label) i').focus();
    <% else %>
        $('.<%= params[:name] %> a:not(.label)').remove();
        $('.<%= params[:name] %>').prepend("<a data-remote='true' href='/update?name=<%= params[:name] %>&amp;<%= params[:name] %>=false&amp;type=checkbox'><i class='icon ion-android-checkbox' tabindex='0'></i></a>");
        $('.<%= params[:name] %> a:not(.label) i').focus();
    <% end %>
<% end %>

LINQ2SQL功能非常强大,如果需要,可以允许部分匹配(包含)。

存储过程解决方案可能会导致parameter sniffing。但是,对于大量人员,仍需要适当的索引来避免表扫描。