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

4

我正在尝试在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#数据读取器调用。我的目标是构建一个存储过程,当被调用时,它将返回一行中选定的单元格,具体取决于特定单元格中的信息:

  • 如果ctznPhone不为null,则要获取它。
  • 如果为null,则要获取ctznEml
  • 如果两者都为null,则要返回一条没有联系信息的消息(我已经将其放在@NoInfo中)。

我这样做的方式正确吗?


2
COALESCE 是你想要的,但你也应该知道 != null 是错误的,你需要使用 is not nullis null 这两个都是一元运算符。 - Hogan
1个回答

6
您可以使用 COALESCE 函数:

COALESCE ( expression [ ,...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

“AS contactInfo”是什么?这是一个虚构的名称,用于返回此信息吗? - Nimrod Yanai
1
@NimrodYanai 是的,它是表达式的列别名。 - Lukasz Szozda
1
太棒了! 我不知道为什么我们的老师要求我们使用IIF,当这个COALESCE更符合我们需求且更准确。 - Nimrod Yanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接