首页 > 解决方案 > 如何从下面的sql表中获取数据?

问题描述

我的表结构是

Value  0   1   2
  X    c   a   d
  Y    d   b   e
  Z    e   c   f

我的 sql 查询是

Declare @CharValue Char(1)='c';
Declare @CharIndex int=0;
Select [Column] from Data_Masking where '['+Cast(@CharIndex as varchar(5))+']'= 'c'

我需要从上面的查询中输出为“X”,但它的返回为空。

标签: sqlsql-server

解决方案


您不能用变量替换必须是文字的列名。您可以使用动态 SQL 来做到这一点,但除非您真的知道如何使用它,否则我不建议您走这条路。

考虑到您的表格的简单性,我建议使用“几个”OR子句:

SELECT [Value]
FROM dbo.YourTable
WHERE (@@CharIndex = 0 AND [0] = @CharValue)
   OR (@@CharIndex = 1 AND [1] = @CharValue)
   OR (@@CharIndex = 2 AND [2] = @CharValue)
OPTION (RECOMPILE);

我真的,同样,推荐更好的名字012。不要使用需要定界标识的对象名称。

db<>小提琴

如果您“必须”使用动态 SQL 执行此操作,则需要执行以下操作。但是请注意,使用动态 SQL 需要考虑很多因素。如果您不了解动态 SQL 的安全含义,则不应使用它。事实上,我建议你应该改变你的设计:

DECLARE @CharValue char(1) = 'c',
        @CharIndex sysname = N'0';

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT [Value] AS [ColumnValue] FROM dbo.YourTable WHERE ' + QUOTENAME(@CharIndex) + N' = @CharValue;';
--PRINT @SQL;
EXEC sys.sp_executesql @SQL, N'@CharValue char(1)', @CharValue;

DB<>小提琴


推荐阅读