如何在SQL中按列名检查单元格是否为空?

时间:2016-04-24 15:17:43

标签: c# sql sql-server tsql stored-procedures

我正在尝试在SQL中构建存储过程。

我有以下语法:

CREATE PROCEDURE [dbo].[getAllCitizens]
    @NoInfo as nvarchar(50) = "No contact information inserted."
AS
BEGIN
    SET NOCOUNT ON;
    IF ctznPhone != null
        BEGIN
            SELECT ctznTz, ctznLname, ctznFname, ctznPhone
            FROM tblCitizens
            Where ctznLivestat=1
        END
    ELSE
        BEGIN
            IF ctznEml != null
                BEGIN
                SELECT ctznTz, ctznLname, ctznFname, ctznEml
                FROM tblCitizens
                Where ctznLivestat=1
                END
            ELSE
                BEGIN
                    SELECT ctznTz, ctznLname, ctznFname, @NoInfo
                    FROM tblCitizens
                    Where ctznLivestat=1
                END
        END
END

如何告知列ctznPhonectznEml在哪个表中的过程?

我尝试了dbo.tablename.columname以及()[]的各种尝试,但它似乎无法发挥作用。

最终,此过程将由C#datareader调用。 我要做的是构建一个过程,当被调用时,将根据特定单元格中的信息从一行返回所选单元格:

  • 如果ctznPhone不为空,那么我想得到它。
  • 如果它为空,我想改为ctznEml
  • 如果这也是空的,我想收到一条消息,说明没有联系信息(我放在@NoInfo中的字符串)。

我能以正确的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

您可以使用COALESCE

  

COALESCE(表达式[,... n])

     

按顺序计算参数,并返回最初未计算为NULL的第一个表达式的当前值。

CREATE PROCEDURE [dbo].[getAllCitizens]
    @NoInfo as nvarchar(50) = "No contact information inserted."
AS
BEGIN
  SET NOCOUNT ON;

  SELECT ctznTz, ctznLname, ctznFname,
         COALESCE(ctznPhone, ctznEml, @NoInfo) AS contactInfo
  FROM tblCitizens
  WHERE ctznLivestat=1;

END