在sql中是否有一种干净的方法来创建基于case语句的select语句?
我正在寻找类似
的基本逻辑 CASE @tableToUse
WHEN 'Table1' SELECT * FROM Table1
WHEN 'Table2' SELECT * FROM table2
DEFAULT 'Table3' SELECT * FROM table3
END CASE
答案 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