我一直试图在选择中从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
答案 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