0

First NameLast NameEmployee IDを含むEMPLOYEEという名前のテーブルがあります。First Nameだけ、Last nameだけ、または両方を検索したときに、行を取得したいと考えています。どうやってするか?

4

2 に答える 2

1

次のクエリを使用できます。2 つのパラメーターがあり、それらで検索したくない場合は NULL にすることができる@FirstNameと仮定します。@LastName

SELECT * FROM EMPLOYEE
WHERE ([First Name] = @FirstName OR @FirstName IS NULL)
    AND ([Last Name] = @LastName OR @LastName IS NULL)
于 2013-10-13T08:24:00.770 に答える
0

動的クエリを使用します。

DECLARE @FirstName NVARCHAR(50), @LastName NVARCHAR(50);
SET @FirstName = 'John';
SET @LastName = 'Johnson';

DECLARE @SqlStatement NVARCHAR(MAX), @SqlParamters NVARCHAR(MAX);
SET @SqlStatement = N'SELECT e.EmployeeID, e.FirstName, e.LastName FROM dbo.Employee e
' 
+ CASE WHEN @FirstName IS NOT NULL OR @LastName IS NOT NULL THEN 'WHERE '
+ CASE WHEN @FirstName IS NOT NULL THEN 'e.FirstName = @pFirstName'
+ CASE WHEN @LastName IS NOT NULL THEN 'e.LastName = @pLastName';

-- PRINT @SqlStatement;

EXEC sp_executesql 
    @SqlStatement, 
    N'@pFirstName NVARCHAR(50), @pLastName NVARCHAR(50)',
    @pFirstName = @FirstName,
    @pLastName = @LastName;

インデックス作成: 次のインデックスがある場合

CREATE INDEX IX_Employee_LastName_FirstName
On dbo.Employee (LastName, FirstName);

次の述語のみが SARGable (Index Seek) です。

WHERE e.LastName = @pLastName

WHERE e.LastName = @pLastName AND e.FirstName = @pFirstName 

しかし、次の述語は SARGable ではありません (Index Scan):

WHERE e.FirstName = @pFirstName 
于 2013-10-13T08:57:49.303 に答える