sql-server – 为什么我不能使用CASE语句来查看列是否存在而不是SELECT?

为什么这样的事情不起作用?
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 ...
;

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03