2017-01-11 18 views
1

我創建的SQL Server存儲過程如下:SQL查詢 - 添加NOT NULL條件,無論是兩列

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 

以上成功執行,但包含了一定的成效,其中的文本字段是唯一場與數據,其他人爲NULL。我想添加一個條件,說在返回的結果中,IndividualName不能爲null或者EntityName不能爲null。

我很難找出把這個和確切的語法放在哪裏。

+3

你需要一個WHERE子句和使用IS NOT NULL – scsimon

+1

在其他單詞'Where(IndividualName不是null或EntityName不爲null)'。從你寫的 –

回答

2

我假設你的意思是其中一個字段可以爲空。如果是這樣的話:

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 
+1

'SQL'翻譯換句話說'IndividualName不爲null或者EntityName不爲空' –

+0

@Prdp真的,但是當你開始添加其他條件時,這會更加整齊,不太可能導致混淆。 – JohnHC

+0

Upvoted ..但是我覺得很多人覺得在'NOT' –

0

您也可以在連接條件中使用這些條件。

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 
2

您可以在兩列做一個ISNULL和檢查,以確保該值不爲空,如下所示:

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 
+1

酷...從來沒有見過這樣的sql結構'不是isnull(c.IndividualName,c.EntityName)是null' ... +1 –

+1

雖然一個聰明和可讀的方法,這是如何處理大型數據集?另外,sargable? – JohnHC

+1

好問題約翰。我之前在很大的數據集上使用過這種方法,但我無法確定它是否是可靠的(我猜測它不是)。 – MDiesel