Sql 有没有办法根据条件选择不同的列?

Sql 有没有办法根据条件选择不同的列?,sql,stored-procedures,Sql,Stored Procedures,编辑以消除歧义:在MVC中查看,而不是数据库视图。 你好, 每次开发数据库驱动的应用程序时,我都要面对一个设计决策。假设我有一个表X,我想根据视图获取不同的列。一个视图可能需要一列,另一个视图可能需要所有列 我目前正在做的是使用一个存储过程返回所有列select*fromx,并根据视图绑定这些列。我不认为这是正确的方法,因为我选择了不必要的列,数据库很大,流量也在增加 实现这种设计的最佳方式是什么?我应该保持1 SP方式还是为每个视图都有一个存储过程(每个SP返回不同的列)。这里有没有有用的设计

编辑以消除歧义:在MVC中查看,而不是数据库视图。

你好,

每次开发数据库驱动的应用程序时,我都要面对一个设计决策。假设我有一个表X,我想根据视图获取不同的列。一个视图可能需要一列,另一个视图可能需要所有列

我目前正在做的是使用一个存储过程返回所有列
select*fromx
,并根据视图绑定这些列。我不认为这是正确的方法,因为我选择了不必要的列,数据库很大,流量也在增加

实现这种设计的最佳方式是什么?我应该保持1 SP方式还是为每个视图都有一个存储过程(每个SP返回不同的列)。这里有没有有用的设计模式?我曾想过为SP指定列,但这会使维护成为一场噩梦,因为我必须跟踪每个视图的columns参数


谢谢。

您可以向SP传递一个参数,以标识要检索的列列表,并动态执行语句和返回

你可以用两种不同的方法来做:

  • 将列列表作为字符串传递给存储过程。这是不安全的,很难跟踪访问的内容
  • 传递表示要检索的列列表的id。此id可用于查找存储最相关列集(当然不是所有可能的子集)的配置表。它更安全、更易于管理

您可以向SP传递一个参数,以标识要检索的列列表,并动态执行语句和返回

你可以用两种不同的方法来做:

  • 将列列表作为字符串传递给存储过程。这是不安全的,很难跟踪访问的内容
  • 传递表示要检索的列列表的id。此id可用于查找存储最相关列集(当然不是所有可能的子集)的配置表。它更安全、更易于管理

如果您热衷于使用存储过程进行数据访问,那么我更希望每个视图使用一个存储过程。您甚至可以引入约定,使过程名称和视图名称具有某种形式的1-1对应关系

这意味着您可以轻松确定每个视图使用哪个存储过程。这还意味着您可以在每个过程中应用合适的(不同的)过滤器,传递不同的参数,等等


我假设您正在进行直接数据库访问,而不是使用某种形式的ORM或DAL。如果这些系统对存储过程有很强的支持,那么它们中的大多数系统都是以存储过程始终返回具有相同“形状”(即相同列)的结果集为前提构建的。

如果您热衷于使用存储过程进行数据访问,那么我更愿意在每个视图中使用一个存储过程。您甚至可以引入约定,使过程名称和视图名称具有某种形式的1-1对应关系

这意味着您可以轻松确定每个视图使用哪个存储过程。这还意味着您可以在每个过程中应用合适的(不同的)过滤器,传递不同的参数,等等


我假设您正在进行直接数据库访问,而不是使用某种形式的ORM或DAL。如果这些系统对存储过程有很强的支持,那么它们中的大多数系统都是围绕存储过程始终返回具有相同“形状”(即相同列)的结果集这一前提构建的。

基于存储过程的参数,您可以使用CASE语句返回不同的值(来自不同列)。不过,实际的列名是固定的

伪代码:

procedure get_stuff (@p_what varchar)
as
begin

  select case @p_what
      when 'NAME' then t.name
      when 'DESCR' then t.description
      else null
    end as the_column
  from my_table t

end  

根据存储过程的参数,可以使用CASE语句返回不同的值(来自不同的列)。不过,实际的列名是固定的

伪代码:

procedure get_stuff (@p_what varchar)
as
begin

  select case @p_what
      when 'NAME' then t.name
      when 'DESCR' then t.description
      else null
    end as the_column
  from my_table t

end  

我假设您在问题中对“视图”的所有使用都与MVC(或MVP)应用程序中的视图相关,而不是与SQL视图相关?这是正确的,对不起,视图一词的使用模棱两可。我假设您在问题中对“视图”的所有使用都与MVC(或MVP)应用程序中的视图相关,而不是与SQL视图相关?这是正确的,对不起,view这个词的用法模棱两可。谢谢你的回答。查找配置表听起来很有趣。我会尝试自己去探索,但是,你以前做过类似的事情吗?如果是,你能举个例子吗?谢谢。我知道了,但我不知道您使用的是哪种语言和数据库,所以这里可能不相关:)我可以问一下这有什么关系吗?这个问题(我认为它是一个问题)语言/数据库不可知论吗?你可以,我不熟悉所有的DBMS,所以我不确定是否支持动态语句执行。客户端应用程序是用.NET编写的,列集合ID映射为枚举。感谢您的回答。查找配置表听起来很有趣。我会尝试自己去探索,但是,你以前做过类似的事情吗?如果是,你能举个例子吗?谢谢。我知道了,但我不知道您使用的是哪种语言和数据库,所以这里可能不相关:)我可以问一下这有什么关系吗?这个问题(我认为它是一个问题)语言/数据库不可知论吗?你可以,我不熟悉所有的DBMS,所以我不确定是否支持动态语句执行。客户端应用程序是用.NET编写的,列集合ID被映射为一个枚举。我不知道为什么我没有考虑这个问题。我想得太多了!我会写一个快速原型来看看事情会如何发展。Ali:如果把它标记为可接受的解决方案,如果它解决了你的问题,和/或投票的答案。我不知道为什么我没有想到的情况。我想得太多了!我