0

假设我有列is_return_foo,is_return_baris_return_baz.

如果上述任何一项分别设置为 true,我需要返回 foo、bar、baz 列...

CASE WHEN最好的选择吗?

就像是:

SELECT
    CASE is_return_foo WHEN true THEN foo ELSE null
    CASE is_return_bar WHEN true THEN bar ELSE null
    CASE is_return_baz WHEN true THEN baz ELSE null
    another_column
FROM 
    my_table

更新

基本上我想根据开/关标志返回列。因此,如果标志 A 开启则返回 A 列值,如果标志 B 开启则返回 B 列值。

也许我们可以说基于权限但更细粒度。

假设您有电子邮件,其中包含收件人、发件人、正文、标题、阅读、阅读时间。

因此,标准用户只能看到来自、正文,而高级客户可能被配置为还读取标题、读取和读取时间。

但是希望每列而不是列组。

如果它是一组列,那么我们可以很容易地说 CASE WHEN Premium THEN 标题、阅读、阅读时间。

更新 2

我认为我们可以进行基于组的“权限”,因此如果您是银牌会员,您只能看到一些字段,但如果您是金牌会员,您可以看到所有字段。

4

3 回答 3

1

动态 TSQL 和数据透视表适用于此用例。

DECLARE @Columns nvarchar(max);
DECLARE @Sql     nvarchar(max);

SELECT @Columns = CONCAT('[', Column, ']') FROM Permissions

SET @Sql = '
  SELECT pvt.*
  FROM Data AS d
  PIVOT (MIN(ColumnValue) FOR ColumnName IN (' + @Columns +')) AS pvt'

EXEC sp_executesql @Sql;

sp_executesql 参考

Pivot 参考

于 2018-11-28T00:45:05.530 回答
1

也许这样的事情是您正在寻找的解决方案:

SELECT
    your columns here
FROM my_table
where COALESCE(is_return_foo,is_return_bar,is_return_baz) is not null
于 2018-11-27T15:49:42.560 回答
0

CASE 语句是我所知道的完成您在问题中尝试执行的操作的唯一方法......至少没有很多 IF/ELSE 条件会复制您的基本选择语句的代码(将管理的噩梦)。如果我们更多地了解这些字段是什么以及为什么存在这种情况,可能会有更好的解决方案可供您使用。我的直觉告诉我,这些作为单独的查询会更好,但很难根据“foo”和“bar”类型的例子来判断。

于 2018-11-27T16:28:21.990 回答