【问题标题】:User-defined functions in Database (PostgreSQL)数据库中的用户定义函数 (PostgreSQL)
【发布时间】:2012-03-25 12:54:23
【问题描述】:

假设我已经定义了数据结构:

Users(u_id, name);

给定u_id,以及获取用户完整资料的存储过程/函数:

getUserProfile(u_id) RETURNS (u_id, firstname, lastname, age);

现在,我想要一种方法来轻松检索所有用户,比如说 20 岁以下。 在此基础上构建的合适组件是什么,以便我可以调用类似的内容:

SELECT *
FROM user_profiles as UP
WHERE UP.age < '20'

【问题讨论】:

  • 缺少基本信息。 firstname, lastname, age 来自哪里? “数据结构”应该是什么?函数getUserProfile() 显然专门用于返回一个用户的详细信息。需要查询源表。
  • @ErwinBrandstetter 实际上,getUserProfile() 函数执行一些过程语言函数,实际上是 PL/Java。但是,我真正喜欢的是有某种查询用户配置文件的方法,类似于如果它是一个数据集。 IE。查找我的所有特定年龄的用户?
  • @Larry:如果您将getUserProfile() 函数定义为returns table,您可以像视图一样使用它:select * from getUserProfile() where age &lt; 20 当然在这种情况下您不会将u_id 传递给它。跨度>
  • @a_horse_with_no_name 我知道你在说什么,尽管在这种情况下,我无法更改此功能。它实际上是建立在几个子功能之上的一个功能,这才是真正的系统设计。因此,假设这是我需要处理的,我如何才能实现我想要的,即我可以在哪里查询我的用户的属性。
  • @Larry:你有一个存储所有用户(尤其是用户ID)的表吗?

标签: database postgresql database-design stored-procedures


【解决方案1】:

假设 getUserProfile() 返回具有上述列的自定义数据类型,您可以执行以下操作:

SELECT (prof).u_id, 
       (prof).firstname, 
       (prof).lastname, 
       (prof).age
FROM (
  SELECT getUserProfile(u_id) as prof
  FROM users
) t
WHERE (prof).age < 20

注意 prof 需要用括号括起来,否则解析器会认为它是一个表引用。

您可以将整个事物包装到一个视图中(显然没有 WHERE 条件)以使事情变得更容易。

【讨论】:

  • 非常感谢,这很好。是的,该函数将返回与您所拥有的类似的自定义数据类型。另一件事,什么是 t,只是随意的东西?
  • @Larry: t 是派生表的别名(“子选择”)。 Postgres 需要它。你也可以改用user_profile
  • 我还有一个关于这个的问题?函数 getUserProfile(u_id) 究竟是如何知道从 Table Users 中获取 u_id 的?此外,我的意思是,我可以有类似 getUserProfile(u_id, a_id, b_id) 的东西,其中实体用户也是用模式 [u_id, a_id, b_id, name] 定义的。这是否仍然有效,或者需要进行哪些调整?
  • @Larry: 因为选择使用from users,所以对u_id 的引用必须来自表users。是的,您可以扩展函数getUserProfile() 以接受更多参数。
  • 好的,这是否意味着我需要命名我的函数参数以便它们匹配,或者它只会按照从用户中选择的顺序获取参数?
【解决方案2】:

您需要另一个存储过程/函数来获取 20 岁以下的用户,对于第一个过程或函数返回的每个用户,您可以调用第二个。

或者您可以在一个结构中完成所有操作。创建一个返回用户信息并接受另一个名为 age 的参数的过程,然后返回一个结果集而不是仅返回一个用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 2015-07-06
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多