Sql server 如何在SQL Server查询中有条件地返回列?

Sql server 如何在SQL Server查询中有条件地返回列?,sql-server,tsql,case-expression,Sql Server,Tsql,Case Expression,假设我有列is_return_foo,is_return_bar和is_return_baz 我需要返回foo,bar,baz列,如果上面的任何一个分别设置为true 当是最佳选择时,是否为最佳选择 比如: 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 TH

假设我有列
is_return_foo
is_return_bar
is_return_baz

我需要返回foo,bar,baz列,如果上面的任何一个分别设置为true

当是最佳选择时,
是否为最佳选择

比如:

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值

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

假设你有一封邮件,邮件的收件人、发件人、正文、标题、阅读时间、阅读时间

因此,标准用户只能查看发件人、正文,而高级客户可能会被配置为同时读取标题、读取和读取时间

但我想对每列执行ot,而不是对列组执行ot

若它是一组列,那个么我们就可以很容易地说它的大小写,然后是标题,读,读时间

更新2


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

也许您正在寻找类似的解决方案:

SELECT
    your columns here
FROM my_table
where COALESCE(is_return_foo,is_return_bar,is_return_baz) is not null

也许您正在寻找类似的解决方案:

SELECT
    your columns here
FROM my_table
where COALESCE(is_return_foo,is_return_bar,is_return_baz) is not null

CASE语句是我所知道的完成您在问题中试图做的事情的唯一方法……至少在缺少大量IF/ELSE条件的情况下,它会复制基本select语句的代码(这将成为管理噩梦)。如果我们更多地了解这些字段是什么以及为什么会出现这种情况,那么可能会有更好的解决方案可供您使用。我的直觉告诉我,作为单独的查询,这些会更好,但根据“foo”和“bar”类型的示例很难判断。

CASE语句是我所知道的完成您在问题中试图做的事情的唯一方法……至少在缺少大量IF/ELSE条件的情况下,它会复制基本select语句的代码(这将成为管理的噩梦)。如果我们对这些字段以及为什么会出现这种情况有更多的了解,那么可能会有更好的解决方案。我的直觉告诉我,作为单独的查询,这些会更好,但根据“foo”和“bar”很难判断键入示例。

动态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

动态TSQL和Pivot表适用于此用例

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

具有示例数据和示例所需结果会很有帮助。我希望返回基于开/关标志的列。可能您可以使用视图和列级安全性执行此操作。具有示例数据和示例所需结果会很有帮助。我希望返回基于开/关标志的列可能您可以使用视图执行此操作d列级安全性我不认为OP是在问这个问题。根据我的阅读方式,他希望这样:“如果Column1=true,返回Column1A”和“如果Column2=true,返回Column2A”等等。在我重读这个问题之前,我一直认为他想要的是联合。我不认为这是OP所问的。根据我阅读的方式,他想要的是:“如果Column1=true,返回Column1A”和“如果Column2=true,返回Column2A”等等。在我重读这个问题之前,我一直认为COALESCE是他想要的。是的,我认为这是你想要做的。在你的权限示例中,我个人不建议使用这种方法来实现这个目标。主要是因为你正在将业务逻辑直接移动到数据库中。如果你确实想这样做的话尽管如此,我所知道的唯一选择将是您当前使用CASE所做的事情的类型,除非您想要IF/THEN逻辑的噩梦。那么您有什么建议呢?我检查API中的权限,并根据实际代码中的CASE语句返回列?很难给您一个“精确”的值回答我,因为我并不真正了解你的情况。因为我不知道你在使用什么类型的技术,这也使得你很难给出关于“做什么”的建议。在你给出的示例中,你只有2个“组”:Standard和Premium。如果这是您所期望的,您可以轻松创建两个不同的查询,并仅返回所需的数据。如果您希望随着时间的推移变得更加复杂,您将需要额外的模式来支持这一点,并且这个开/关标志的示例可能会很快变得非常有限…即…can 2组有一个打开,一个关闭,等等?您还可以返回满足业务需求所需的所有列(即…显示所有数据),然后有两个基于类的对象来表示您的两个组,并且只将数据从db序列化到与该对象类型相关的字段。请查看AutoMapper(AM)(以及一般的投影)如果您从未使用过它…AM有一个很棒的扩展方法,名为ProjectTo,它允许您构建POCO并构建LINQ查询以仅获取您想要的数据。这将是解决此问题的一个很好的方法,它消除了您在使用这些其他方法时会遇到的大多数负面问题。是的,我以为这就是您想要的ting to do。在您的权限示例中,我个人不建议使用此方法来实现此目标。主要原因是您正在将业务逻辑直接移动到数据库中。如果您确实想这样做,我知道的唯一选项是您当前正在使用CASE执行的操作类型,除非您需要nIF/THEN逻辑的关键。那么你有什么建议呢?我检查API中的许可证,并根据实际代码中的case语句返回列?很难给出“准确”的答案,因为我并不真正了解您的场景。因为我不知道您使用的是哪种技术,这也使得它很困难