我一直试图从CASE(def.OPTION_CATEGORY_ID)
中选择一个文本结果,但我很难实施条款。如何仅在列存在时使用SQL列名称?
我想要做的是检查是否OPTION_CATEGORY_ID
是sys.columns中的现有列。如果是,那么我试图通过在底部使用When - Then
来进行文本翻译,但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
你试图做太多一次。这种“SQL-SQL”不起作用。你需要做的是查询模式,并生成一个单一的字符串变量,它包含一个新的SQL语句*(写SQL的SQL)*。然后,作为一个单独的步骤,您可以使用'EXEC sp_executesql'作为SQL语句运行该字符串,该EXEC sp_executesql还支持参数化查询。 Google'Dynamic-SQL和SQL-Server'获取更多细节。 – MatBailie
这个要求背后的目标是什么?也许有一个更简单的方法去那里... – Paolo
我的数据库可能并且可能没有在def中的列“OPTION_CATEGORY_ID”。 我想在这两种情况下使用相同的查询,但是当它存在时,我希望底部情况为int ID生成正确的文本转换。 –