根据sql中的case语句创建select语句

时间:2010-06-23 14:37:42

标签: sql

在sql中是否有一种干净的方法来创建基于case语句的select语句?

我正在寻找类似

的基本逻辑
   CASE @tableToUse
           WHEN 'Table1' SELECT * FROM Table1 
           WHEN 'Table2' SELECT * FROM table2 
           DEFAULT 'Table3' SELECT * FROM table3
   END CASE

5 个答案:

答案 0 :(得分:4)

在T-Sql(MS SQL Server)中,您可以动态编写SQL语句,然后使用sp_executesql方法执行它。根据您的case语句,您可以使用变量构建SELECT语句,然后使用sp_executesql来运行它。需要注意的一件事是,如果直接使用来自用户的文本来防止SQL注入攻击,则需要确保清除从用户那里获得的任何输入。

例如,

DECLARE @sql NVARCHAR(200)

SELECT @sql = CASE @tableToUse
    WHEN 'Table1' THEN 'SELECT * FROM Table1'
    WHEN 'Table2' THEN 'SELECT * FROM Table2'
    ELSE 'Table3' THEN 'SELECT * FROM Table2'
    END

EXECUTE sp_executesql @sql

您应该能够在其他版本的SQL中执行类似的操作。

答案 1 :(得分:3)

抱歉,tSQL中的Case语句(我假设你要问的)仅用于评估表达式,不能用于控制流程。

你几乎坚持使用IF..THEN

IF (@Something='Table1')
    SELECT Field1 from table1
ELSE
   IF (@Something='Table2')
        SELECT Field1 from table2
   ELSE
        SELECT Field1 From table3

答案 2 :(得分:2)

嗯,这是旧的,但万一有用:

CASE WHEN <Variabe> THEN (SELECT <Column> FROM <Table>) END

答案 3 :(得分:0)

为什么不加入用户名上的testTable?

答案 4 :(得分:0)

你可以这样做!只有你不能做“选择*”因为它可能会返回多个射出错误的值,即使它必须是一个单列的表

SELECT   columnName = CASE WHEN 'foo' THEN select <Column_Name> from tableName where columnName = 'this'  
                           WHEN 'bar' THEN select <Column_Name>  from tableName where columnName = 'that' 
END 
FROM tableName