【问题标题】:Returning integer value that represents the first non-null field返回表示第一个非空字段的整数值
【发布时间】:2012-07-06 07:45:51
【问题描述】:

我创建了以下存储过程:

ALTER PROCEDURE [dbo].[ExampleSP]
(
    @SearchText NVARCHAR(4000),
    @ID INT = NULL
)
AS
BEGIN
SET NOCOUNT ON;

SELECT 
deID,
deTitle
FROM tblDemo As de
LEFT JOIN tblLinkTable As lnk ON (lnk.ID = de.deID)
WHERE CONTAINS(cstKeywords, @SearchText)
AND ((@ID IS NULL) OR (lnk.ID = @ID))
GROUP BY deID,Title 
ORDER BY de.Title

但我还需要能够从下表列中找到第一个不为空的字段:

deIntroText、deCompanyText、deTimetableText 和 deExampleText

我需要对从 SELECT 返回的每条记录执行此操作。

所以我意识到我需要创建一个临时列来存储它,我猜你需要使用这样的 IF 语句:

IF deIntroText IS NOT Null 
THEN TempFieldToReturn = 1

ELSE IF deCompanyText IS NOT Null 
THEN TempFieldToReturn = 2

ELSE IF deTimetableText IS NOT Null 
THEN TempFieldToReturn = 3

ELSE IF deExampleText IS NOT Null
THEN TempFieldToReturn = 4

所以我的问题是 - 实现这一目标的最佳方法是什么?任何示例将不胜感激。

【问题讨论】:

  • 为什么不在数据访问层而不是数据层本身上执行呢?!

标签: sql sql-server tsql sql-server-2000


【解决方案1】:

没有真正的捷径 - 只需使用 CASE 表达式:

SELECT
   /* Other Columns */
  CASE
    WHEN deIntroText IS NOT Null THEN 1
    WHEN deCompanyText IS NOT Null THEN 2
    WHEN deTimetableText IS NOT Null THEN 3
    WHEN deExampleText IS NOT Null THEN 4
  ELSE 5 END as OtherColumn
FROM
  /* Rest of query */

这是一个搜索过的CASE - 实际上有两个CASE 的变体。如果所有列都是 NULL,我猜是 5 - 如果在这种情况下你想要 NULL 的结果,你可能会省略 ELSE 5 部分。

【讨论】:

  • +1 如果可以使用 CHARINDEX 或 PATINDEX,ELSE 0 也可以是一个选项。
猜你喜欢
  • 2017-09-02
  • 2019-12-07
  • 1970-01-01
  • 2017-05-15
  • 2011-01-04
  • 1970-01-01
  • 2015-09-13
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多