我有一个包含10列的表格col_1,col_2,.... col_10。我想写一个select语句,它将选择一行的值和这10列中的一列。我有一个变量,将决定从哪个列中进行选择。可以在从变量动态决定列名的位置写入此类查询。
答案 0 :(得分:11)
是的,使用CASE声明:
SELECT CASE @MyVariable
WHEN 1 THEN [Col_1]
WHEN 2 THEN [Col_2]
...
WHEN 10 THEN [Col_10]
END
这是否是一个好主意完全是另一个问题。您应该使用比Col_1,Col_2等更好的名称
您也可以使用其他人建议的字符串替换方法。但是,这是最后的选择,因为它可以打开你的代码进行SQL注入攻击。
答案 1 :(得分:3)
听起来像是一个糟糕的,非规范化的设计。
我认为更好的一个会将表作为父表,行包含一个包含十行的单独子表的外键,每行对应一个列。当在父表中插入或更新行时,让父表根据该魔术值设置外键。
如果子表是相当静态的,这将起作用。
答案 2 :(得分:3)
希望做动态sql的人的好文章:
答案 3 :(得分:2)
由于我没有足够的细节,我无法提供代码。相反,我会解释。
声明一个字符串变量,类似于:
declare @sql varchar(5000)
将该变量设置为您想要的已完成的SQL字符串(作为字符串,而不是实际查询...所以您使用字符串连接嵌入了您想要的行名称。)
然后致电:exec(@sql)
全部设定。
答案 4 :(得分:1)
我假设您纯粹在Transact-SQL中运行。您需要做的是使用您的变量作为列名动态创建SQL语句,并使用EXECUTE命令来运行它。例如:
EXECUTE('select ' + @myColumn + ' from MyTable')
答案 5 :(得分:0)
您可以使用T-SQl CASE语句执行此操作:
SELECT 'The result' =
CASE
WHEN choice = 1 THEN col1
WHEN choice = 2 THEN col2
...
END
FROM sometable
答案 6 :(得分:0)
恕我直言,Joel Coehoorn's case statement可能是最好的主意
...但是如果你真的必须使用动态SQL,你可以使用sp_executeSQL()
来完成答案 7 :(得分:0)
我不知道您使用的是什么平台,但您可以非常轻松地使用Dynamic LINQ来执行此操作。
var query = context.Table
.Where( t => t.Id == row_id )
.Select( "Col_" + column_id );
IEnumerator enumerator = query.GetEnumerator();
enumerator.MoveNext();
object columnValue = enumerator.Current;
据推测,您将根据列了解将其强制转换为哪种实际类型。关于这一点的好处是你可以免费获得参数化查询,保护你免受SQL注入攻击。
答案 8 :(得分:0)
如果数据库设计正确,这不是您应该做的事情。我将重新审视模式中该元素的设计,以消除执行此操作的需要。