我想使用以下函数(在PostgreSQL中):
create type holder as (userName varchar(50), processName varchar(50),
dateTime timestamp, macAddress varchar(30), labName varchar(50),
subjectName varchar(50));
create or replace function returnData(
uName varchar(50), pName varchar(50), dTimeIn timestamp, dTimeOut timestamp,
macAddress MACADDR, lName varchar(50), subjectName varchar(50)
) returns setof holder as $$
declare
r holder%rowtype;
begin
for r in (SELECT DISTINCT u.name, p.process_name, i.date_time,
c.mac_address, l.lab_name, d.subject_name
FROM user u, session s, init i, process p, computer c, laboratory l,
class a, subject d, occur_in o
WHERE i.process_id = p.process_id AND i.session_id = s.session_id
AND s.user_id = u.user_id AND s.comp_id = c.comp_id
AND c.lab_id = l.lab_id AND l.lab_id = o.lab_id
AND o.class_id = a.class_id AND a.subject_id = d.subject_id
AND p.blocked = true
--important part now
AND u.name = userName AND p.name = processName
AND i.dateTimeIn > dTimeIn AND i.dateTimeOut < dTimeOut
AND c.mac_address = macAddress
AND l.name = lName AND d.name = subjectName
)
loop
return next r;
end loop;
return;
end;
$$
language 'plpgsql';
我将其翻译成英文时可能会有一些错别字,但只要传递有效参数,实际功能就可以正常工作。但是,例如,我的用户可能不想按用户名过滤结果。或者,他可以选择在日期之后携带数据,但不指定结束日期。我可以做一些像
...
IF (userName IS NULL AND pName IS NULL AND ...)
-- query without filtering user name nor process name,
-- filtering or not the other parameters
IF (userName IS NOT NULL AND pName IS NULL AND ...)
--filter user name, don't filter process name,
-- filtering or not the other parameters
...
等等。但是,如果我没记错的话,我必须编写49个查询,因为我有7个可能会或可能不会被过滤的参数。我可以这样做,但是如果可能的话,我想通过做类似的事情来简化查询
SELECT ...
FROM ...
WHERE ...
AND userName = *
如果用户不想过滤用户名,则*是参数uName中的值。有可能做这样的事情吗?有没有更好的方法可以做到这一点?以及如何处理这两个时间戳?
AND (userName is null or u.name = userName)
AND (processName is null or p.name = processName)
AND (dTimeIn is null or i.dateTimeIn > dTimeIn)
AND (dTimeOut is null or i.dateTimeOut < dTimeOut)
AND (macAddress is null or c.mac_address = macAddress)
AND (lName is null or l.name = lName)
AND (subjectName is null or d.name = subjectName)
问题内容: 通过我可以参数化这样的查询; 但是问题在于,如果a为None,则查询应如下所示; 因此,当查询可以为None或字符串时,查询应如何? 问题答案: 解决方案是使用ISO / ANSI标准-安全比较: 并非所有数据库都支持此功能,因此您还可以使用: 如果您不愿意两次传递参数,则可以在子句中包含它:
问题内容: 我在firebase中执行查询时遇到错误,我的查询代码如下所示: 但是我收到以下错误: 异常java.lang.RuntimeException:无法启动活动ComponentInfo {ucarparceiro.ucarapp.com.ucarparceiro / ucarparceiro.ucarapp.com.ucarparceiro.Activity.ActivityPrinc
问题内容: 这可能很明显,但我感到非常困惑。 我有一个带where子句(带参数列表的where)的SQL查询。如果所有这些参数都为null,则需要SQL忽略where子句并检索所有记录。这在SQL中容易做到吗?我知道一种解决方法是,如果参数为null,则仅使用代码删除where子句。 问题答案: 您可以尝试执行以下操作: 当然,它需要在您自己的查询中进行一些调整,但是现在您将检查参数是否为空或执行
我目前正在尝试将我的Firebase数据库中的内容读入中,但我希望将它们从最后一个节点加载到第一个节点。所以我决定将键放入一个数组中,然后尝试从数组的末尾读到前面,但是当我尝试访问键数组时,我看到的是中的参数'path string'传递null错误。