当前位置: 首页 > 面试题库 >

如何在Sybase ASE中模拟GREATEST()?

苗阳文
2023-03-14
问题内容

大多数数据库都有类似GREATEST函数的功能,有时可能会有用。至少这些数据库没有这样的功能:

  • Derby
  • SQL Server
  • Sybase ASE
  • Sybase SQL Anywhere

对于SQL Server和Sybase SQL Anywhere,可以使用子查询对函数进行仿真UNION ALL,并且可以在此问题中看到。一个例子:

-- SELECT GREATEST(field1, field2, field3) FROM my_table
SELECT (SELECT MAX(c) FROM 
                     (SELECT my_table.field1 AS c UNION ALL 
                      SELECT my_table.field2      UNION ALL
                      SELECT my_table.field3) T) AS greatest
FROM my_table

但这在Sybase ASE中不起作用。显然,子查询无权访问外部查询的my_table引用。我得到的错误是

列前缀“ my_table”与查询中使用的表名或别名不匹配。该表要么未在FROM子句中指定,要么具有必须使用的相关名称

注意,Sybase SQL Anywhere不会出现此问题。知道这里出了什么问题以及如何重新编写查询吗?

我想避免

  • 存储的函数,因为我可能没有创建它们的必要授权
  • 冗长CASE的表达式,与嵌套所需的所有比较的组合排列的表达长度CASE表达式至少O(n^2)n是参数数GREATEST

问题答案:

据我了解,逻辑(忽略空值)是

SELECT CASE 
          WHEN field1 >= field2 
               AND field1 >= field3
             THEN field1
          WHEN field2 >= field3
             THEN field2
          ELSE field3
       END AS greatest
  FROM my_table;

…但仅当所有值均为null时,才应返回null。

我认为这是我更希望能够做的事情(尽管Sybase ASE不支持公用表表达式):

WITH my_table
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('A', 1, 2, 3), 
                     ('B', 2, 3, 1), 
                     ('C', 3, 1, 2),
                     ('D', NULL, 2, 3), 
                     ('E', NULL, NULL, 3), 
                     ('F', NULL, 3, NULL), 
                     ('G', 1, NULL, 3), 
                     ('H', 1, 3, NULL), 
                     ('X', NULL, NULL, NULL)
             ) AS T (ID, field1, field2, field3)
     ), 
     T1
     AS
     (
      SELECT ID, field1 AS field_n
        FROM my_table
      UNION
      SELECT ID, field2 AS field_n
        FROM my_table
      UNION
      SELECT ID, field3 AS field_n
        FROM my_table
     )        
SELECT ID, MAX(field_n) AS greatest
  FROM T1
 GROUP 
    BY ID;


 类似资料:
  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典

  • 问题内容: 我尝试了这个: 但是碰巧 即使:par1不为null,也总是返回表的所有行。 而 不返回任何行。 我不能使用本机语法,因为我的应用程序应该在不同的数据库引擎上运行 问题答案: HQL中的命令等效于该命令。 如果不为null,则返回,否则返回。 因此,您需要以下方面的东西:

  • 问题内容: 大多数关系数据库都有某种字符串函数,例如: 会屈服 另一方面,SQLite具有非常有限的功能集。SQLite支持的功能在此处列出: http://www.sqlite.org/lang_corefunc.html 可以使用SQLite中可用的功能进行仿真吗? 问题答案: 我的答案结合了Shiplu Mokaddim的 “printf字符替换重复”和Steve Broberg和[Luka

  • 我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿。看起来代码得到的是真实数据,而不是模拟数据。任何人都可以帮我。 服务本身将如下所示:

  • 是模拟抽象类:,而是接口。这是失败点: 如何模拟这段代码?

  • 我有一种方法可以将文件上传到Amazon S3。我正在尝试为此方法编写JUnit,但在S3AsyncClient上获取NullPointerException: 我的班级: S3UploadData类对象的输入:` @Getter@allargsconstuctor 你能帮我写Junit for uploadFile方法吗?