SQL:如何获取两个字符串列之一,取决于是否填充

时间:2018-12-04 10:14:29

标签: sql-server tsql

我在一些表中,通常将公司地址存储在长公司名称的列和简短格式的列中。长名称是强制性的,短名称不是强制性的。像这样:

"$type": "IqhApplicationEndEvent"

现在在许多查询中,如果要填写,我想访问短格式,否则要访问长格式。所需的功能类似于ISNULL函数,但类似于ISEMPTY函数。

到目前为止,我所做的是创建一个通用的UDF,该UDF获取优先级列,而另一个作为后备:

  {
     "@t": "2018-12-03",
     "@mt": "{@Diagnostic}",
     "Diagnostic": {
            "ShutdownReason": "HostingEnvironment",
            "Timestamp": "2018-12-03",
            "MachineName": "local",
            "AdditionalInfo": {},
            "$type": "IqhApplicationEndEvent"
        }
   }

然后我可以这样调用函数:

 public void WriteAudit(DiagnosticTest diagnostic)
    {
        _Logger?.Write(LogEventLevel.Information, "{@Diagnostic}", diagnostic);
    }

但是我不确定这是否是最佳解决方案。当我在数百万条记录的select块内调用该函数时,是否会影响查询性能? 我最近将所有引擎更新为SQL-Server2017。有内置的内容吗?

1 个答案:

答案 0 :(得分:2)

我认为您正在尝试重新发明轮子。 您可以通过结合两个内置功能来完成所需的工作。

函数为COALESCENULLIF

SELECT coalesce(nullif(shortform,''),nullif(name,'')) as nameShort FROM company

NULLIF将返回NULL值,如果第一个参数与第二个参数相同,此处为''

COALESCE实际上可以接受任意数量的参数,因此它不仅限于两个输入并且返回第一个非空值。