为什么这样的事情不起作用?
SELECT CASE WHEN NULLIF(COL_LENGTH('Customers','Somecol'),'') IS NULL THEN NULL ELSE Somecol END AS MyTest FROM Customers;
我只是检查列是否存在,但是,sql Server抱怨Somecol不存在.在一个声明中是否有替代方案?
解决方法
following query使用与0700年0700相同的想法:
SELECT x.* FROM (SELECT NULL AS SomeCol) AS dummy CROSS APPLY ( SELECT ID,SomeCol AS MyTest FROM dbo.Customers ) AS x;
它的工作原理如下:
>如果dbo.Customers有一个名为SomeCol的列,那么SomeCol AS MyTest中的SomeCol将解析为dbo.Customers.SomeCol;
>如果表没有这样的列,则引用仍然有效,因为现在它将被解析为dummy.SomeCol:可以在该上下文中引用虚拟列.
您可以通过这种方式指定多个“备用”列.诀窍是不要对这些列使用表别名(在大多数情况下这是一种不受欢迎的做法,但在这种情况下省略表别名可以帮助您解决问题).
如果表在连接中使用而另一个表有自己的SomeCol,则可能需要在连接中使用它之前将上述查询用作派生表,以使该技巧保持正常工作,如下所示:
SELECT ... FROM ( SELECT x.* FROM (SELECT NULL AS SomeCol) AS dummy CROSS APPLY ( SELECT ID,SomeCol AS MyTest FROM dbo.Customers ) AS x ) AS cust INNER JOIN ... ;