如果列存在,如何使用SQL列名?

时间:2015-09-04 09:58:47

标签: sql sql-server tsql

我一直试图在选择中从CASE(def.OPTION_CATEGORY_ID)获取文字结果,但我很难实施这些条款。

我尝试做的是检查OPTION_CATEGORY_ID是否是sys.columns中的现有列。如果是,那么我尝试使用底部的When - Then进行int到文本转换,但SQL不知道列名,因此CASE(def.OPTION_CATEGORY_ID)失败,因为列名是无效。

有没有办法使用别名来调用def.OPTION_CATEGORY_ID,这样SQL就不会事先失败?   感谢

SELECT DISTINCT *
    FROM
      (SELECT def.OPTION_DEF_ID AS 'Def ID',
              ass.ASSET_NAME AS 'Asset Name',
              CASE(def.OPTION_TYPE_ID)
                  WHEN 1 THEN 'A'
                  WHEN 2 THEN 'B'

              END AS 'Option Type',
              case when exists (SELECT name
              FROM   sys.columns 
              WHERE  Name  = 'OPTION_CATEGORY_ID'
                     AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) 

    then
        -- Column Exists
         CASE(def.OPTION_CATEGORY_ID) 
                  WHEN 1 THEN 'C'
                  WHEN 2 THEN 'D'
                  WHEN 3 THEN 'E'
                  WHEN 4 THEN 'F'


              end
              End AS 'test' ,

        -- the rest of the select

1 个答案:

答案 0 :(得分:2)

如果你想选择一个列并且你不确定它是否存在,你就不能在代码中明确地编写它,并期望它能够编译。

您应该根据列存在与否的运行时信息动态构建语句:

DECLARE @statement VARCHAR(MAX)

IF((SELECT COUNT(*)
              FROM   sys.columns 
              WHERE  Name  = 'OPTION_CATEGORY_ID'
                     AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) > 0)
BEGIN
 SET @statement = --assign a query which uses OPTION_CATEGORY_ID
END
ELSE
BEGIN
 SET @statement = --assign a query which does not use OPTION_CATEGORY_ID
END

EXEC sp_executesql @statement