我有表格课程,其中有一些字段,还有字段course(string)、favorited(bool)、favoritedDate(dateTime)、 dateUpload。
教师上传课程,此日期存储在dateUpload字段中。如果教师将此课程标记为最喜欢的,则该信息在字段中为数字 1,favorited标记日期存储在字段中favoritedDate。
现在我需要从特定老师那里检索所有课程,然后按日期对列表进行排序:如果课程被标记为favorited=1应由 订购favoritedDate,dateUpload desc,如果favorited=0仅应由 订购 dateUpload desc。
这是我到目前为止所拥有的,但它不起作用:
SELECT * from courses where teacherId = 23
ORDER BY
CASE favorited WHEN 1 THEN favoritedDate, dateUpload
else dateUpload
END
DESC
;
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
在传统编程中,有一条公理:“不要使用错误进行流程控制”。一个常见的示例是抛出错误然后捕获错误,而不是使用普通的条件语句或break语句。这是有害的,因为应用程序必须展开调用堆栈并调用一些相对昂贵的异常处理逻辑,而不是简单地处理条件语句。
我正在使用 Postgres 系统,其中用户在 Postgres 中调用一个函数,该函数在不满足条件时抛出错误而不是不返回任何行。该条件大致是“此输入值不存在,无事可做”,而不是真正的例外情况。
当以与传统编程类似的方式抛出错误时,Postgres 是否会产生运行时成本?换句话说,在 Postgres 中使用异常作为流量控制对性能有害还是只是草率?
您好,感谢您花时间阅读这个问题。
我正在使用 MySQL,并且我想使用 ORDER BY 对一个特定列对结果进行排序,但必须根据该列的特定条件对结果进行排序。例如,对于下表,我想ORDER BY 'group'首先显示9,7,6 'group' items和,最后显示10,8,5 'group' items:
names group
--------- ------
susanita 10
miguelito 5
mafalda 7
manolito 8
libertad 6
felipe 9
guille 8
Run Code Online (Sandbox Code Playgroud)
提前致谢。
据我所知,我有一个独特的问题。我想知道是否有一种方法可以构造一个查询,其中实际 where 子句本身的存在是有条件的。
我正在编写一个存储过程,我想在其中传递一个过滤器(例如Col1=1 or Col2=3),并且我的查询如下所示:
set @filter = 'Col1=1 or Col2=3' --assume these variables have been declared already
select * from @tbl where @filter --I need to use a table variable
Run Code Online (Sandbox Code Playgroud)
注意:我尝试使用sp_executesqlandsp_sqlexec但都不采用表变量。我还想避免使用if-else声明。请不要建议其中任何一个作为您的答案。:)
我正在尝试过滤具有非唯一事务 ID 的表,该表已连接到 1 个公共列上的产品表。过滤器需要如下:
equal to :group1 AND
NOT equal to :group2 AND
NOT equal to :group3
Run Code Online (Sandbox Code Playgroud)
我最初从以下查询开始,但没有AND rk_group <> ____条件。
SELECT COUNT(DISTINCT txn_id)
FROM 1_txns
INNER JOIN 2_products USING (sku)
WHERE rk_group = :group1
AND rk_group <> :group2
AND rk_group <> :group3
;
Run Code Online (Sandbox Code Playgroud)
我也试过
SELECT COUNT(DISTINCT txn_id)
FROM 1_txns
INNER JOIN 2_products USING (sku)
WHERE rk_group NOT IN ( :group2, :group3)
;
Run Code Online (Sandbox Code Playgroud)
我还尝试了多种连接和 IN() 和 NOT IN() 的组合,它仍然返回所有团队 ID,包括那些存在 NOT 组的团队 ID。
有人可以指出我正确的方向吗?
与查询相关的架构信息:
table 1_txns …Run Code Online (Sandbox Code Playgroud) 我正在阅读的这本书对为什么将最严格的条件放在WHERE子句最后给出了一个相当糟糕的解释。
假设我们有查询 1:
SELECT COUNT(*)
FROM TEST
WHERE LAST_NAME = 'SMITH'
AND CITY = 'INDIANAPOLIS';
Run Code Online (Sandbox Code Playgroud)
和查询 2:
SELECT COUNT(*)
FROM TEST
WHERE CITY = 'INDIANAPOLIS'
AND LAST_NAME = 'SMITH';
Run Code Online (Sandbox Code Playgroud)
第一个查询需要 20 秒,而第二个查询只需要 10 秒。这本书继续说“因为第二个查询返回更快的结果并且最严格的条件列在 WHERE 子句的最后,可以安全地假设优化器自下而上读取 WHERE 子句。
我很困惑我应该如何做出这个推断。是不是在 1 个条件后过滤比第一个过滤器慢得多?
我一直在努力理解如何处理在这种情况下经常出现的特定类型的性能问题:当您想在查询中应用多个过滤器,但您知道第一个过滤器将返回一个非常小的数字时来自一个非常大的表的行。
例如,我们有一个包含 10M+ 行的 3rd-party 异构表,其中的列根据TYPEID. 这是一个示例查询:
SELECT ID, NAME, INT109 FROM DATA WHERE TYPEID = 8301514 AND INT109 = 1
Run Code Online (Sandbox Code Playgroud)
在此查询中,两个过滤器没有覆盖索引,但在 'TYPEID' 列上有一个索引。令人困惑的是,即使表中的 10M 中只有大约 500 行TYPEID = 8301514,但此查询有时需要很多秒才能运行。
如果我只是INT109 = 1在最后删除过滤器,查询几乎立即运行:
SELECT ID, NAME, INT109 FROM DATA WHERE TYPEID = 8301514
Run Code Online (Sandbox Code Playgroud)
对我来说,使用较少的过滤器会使查询运行得更快是没有意义的。此外,行为似乎不一致 - 如果第一个查询已经运行多次,它也可以运行得非常快,就像正在缓存某些东西一样。很难做可靠的实验(这是在 SQL Azure 中)。这是正常行为吗?这是否是由错误的执行计划(即使我没有使用参数)或过时的统计数据引起的?
performance sql-server optimization condition azure-sql-database
condition ×7
mysql ×3
order-by ×2
sql-server ×2
join ×1
optimization ×1
performance ×1
plpgsql ×1
postgresql ×1
where ×1