Reputation: 3457
I am creating a stored procedure in SQL Server as follows:
CREATE PROCEDURE [dbo].[SearchData]
@searchText varchar(500)
AS
BEGIN
SET NOCOUNT ON
SELECT TOP 50
s.[MaxRank] AS [Rank],
sc.TaskSourceId,
c.IndividualName,
c.EntityName,
c.Text
FROM
(SELECT
MAX(s.Rank) AS MaxRank,
MAX(c.CaptureId) AS MaxCaptureId,
c.TaskSourceId
FROM
FreeTextTable(Data.SearchData,
(Identifier, IndividualName, EntityName, [Text]), @searchText) s
JOIN
Data.Capture c ON s.[Key] = c.CaptureId
GROUP BY
c.TaskSourceId) s
JOIN
Data.Capture c ON c.CaptureId = s.MaxCaptureId
JOIN
Data.Source sc ON c.TaskSourceId = sc.TaskSourceId
ORDER BY
s.MaxRank DESC
END
The above executes successfully but includes some results where the Text field is the only field with data, with the others being NULL. I want to add a condition that says that, in the returned results, IndividualName must not be null OR EntityName must not be null.
I'm having trouble figuring where to put this and the exact syntax.
Upvotes: 1
Views: 2878
Reputation: 2667
You can do an isnull on both columns and check to make sure that value is not null, like this:
CREATE PROCEDURE [dbo].[SearchData]
@searchText varchar(500)
AS BEGIN SET NOCOUNT ON
select top 50 s.[MaxRank] as [Rank],
sc.TaskSourceId,
c.IndividualName,
c.EntityName,
c.Text
from (
select max(s.Rank) as MaxRank,
max(c.CaptureId) as MaxCaptureId,
c.TaskSourceId
from FreeTextTable(Data.SearchData,
(Identifier, IndividualName, EntityName, [Text]),
@searchText) s
join Data.Capture c
on s.[Key] = c.CaptureId
group by c.TaskSourceId
) s
join Data.Capture c
on c.CaptureId = s.MaxCaptureId
join Data.Source sc
on c.TaskSourceId = sc.TaskSourceId
where not isnull(c.IndividualName, c.EntityName) is null
order by s.MaxRank desc
END
Upvotes: 2
Reputation: 3127
You can also use these condition in the join condition.
CREATE PROCEDURE [dbo].[SearchData]
@searchText varchar(500)
AS BEGIN SET NOCOUNT ON
select top 50 s.[MaxRank] as [Rank],
sc.TaskSourceId,
c.IndividualName,
c.EntityName,
c.Text
from (
select max(s.Rank) as MaxRank,
max(c.CaptureId) as MaxCaptureId,
c.TaskSourceId
from FreeTextTable(Data.SearchData,
(Identifier, IndividualName, EntityName, [Text]),
@searchText) s
join Data.Capture c
on s.[Key] = c.CaptureId
group by c.TaskSourceId
) s
join Data.Capture c
on c.CaptureId = s.MaxCaptureId AND (c.IndividualName IS NOT NULL OR c.EntityName IS NOT NULL)
join Data.Source sc
on c.TaskSourceId = sc.TaskSourceId
order by s.MaxRank desc
END
Upvotes: 0
Reputation: 11205
I assume you mean that one of the fields CAN be null. If so:
CREATE PROCEDURE [dbo].[SearchData]
@searchText varchar(500)
AS BEGIN SET NOCOUNT ON
select top 50 s.[MaxRank] as [Rank],
sc.TaskSourceId,
c.IndividualName,
c.EntityName,
c.Text
from (
select max(s.Rank) as MaxRank,
max(c.CaptureId) as MaxCaptureId,
c.TaskSourceId
from FreeTextTable(Data.SearchData,
(Identifier, IndividualName, EntityName, [Text]),
@searchText) s
join Data.Capture c
on s.[Key] = c.CaptureId
group by c.TaskSourceId
) s
join Data.Capture c
on c.CaptureId = s.MaxCaptureId
join Data.Source sc
on c.TaskSourceId = sc.TaskSourceId
where not (c.IndividualName is null and c.EntityName is null) -- excludes results where both are null
order by s.MaxRank desc
END
Upvotes: 2