【问题标题】:SQL Case With Many Columns多列的 SQL 案例
【发布时间】:2012-09-26 14:51:24
【问题描述】:

您好,我查看了“多列案例”问题,没有看到与此相同的内容,所以我想我应该问一下。

基本上我有两个要加入的表(都是子查询的结果)。它们具有相同的列名。如果我加入他们的 id 和 SELECT * 我会得到每一行是这样的:

A.id, A.x, A.y, A.z, A.num, B.id, B.x, B.y, B.z, B.num

我想要的是一种只选择 num 值较低的表列的方法。所以在这种情况下,结果表总是有 5 列,id, x, y, z, num,我不在乎id, x, y, z, num 事后来自哪个表。如果它们相等,任何一个表结果都可以。

SELECT CASE WHEN A.num < B.num THEN A.* ELSE B.* END FROM A JOIN B ON A.id=B.id

会很完美,但你只能在 CASE 语句中返回一列,我可以为每一列使用 CASE,但这似乎很浪费(我的实际数据库中的每个表中有 8 个,所以我会有 8 个 CASE 语句)。

这是 SQLite 顺便说一句。任何帮助将不胜感激!


编辑以获取有关 A 和 B 的更多信息: A 和 B 来自这样的查询

SELECT "认为案例陈述可能会出现在这里" FROM

(SELECT id, x, y, z, num FROM Table1 a JOIN Table2 b ON a.id=b.id AND (y BETWEEN (53348574-3593) AND (53348574+3593)) AND (z BETWEEN (- 6259973-6027) AND (-6259973+6027)) JOIN Table3 c ON c.id= b.id GROUP BY a.id, cr) A

加入

(SELECT id, x, y, z, num FROM Table1 a JOIN Table2 b ON a.id=b.id AND (y BETWEEN (53401007-3593) AND (53401007+3593)) AND (z BETWEEN (- 6397286-6027) AND (-6397286+6027)) JOIN Table3 c ON c.id= b.id GROUP BY a.id, cr ) B ON A.id=B.id

因此,如果您想知道为什么会有这么大的数字,它会连接两个基于地理位置创建的表,并且需要根据在任一位置找到的属性来决定从哪个表中获取数据。

【问题讨论】:

标签: sql sqlite select join case


【解决方案1】:

试试

select A.id, A.x, A.y, A.z, A.num from  A JOIN B ON A.id=B.id where a.num<b.num
union
select b.id, b.x, b.y, b.z, b.num from  A JOIN B ON A.id=B.id where b.num<a.numhere

【讨论】:

  • 但是在这种情况下我必须再次进行子查询,不是吗? (A 和 B 来自子查询,我将结果表称为 A 和 B)。我在 SQLite 数据库浏览器中尝试过,它不知道 UNION 后面的 A 是什么,它似乎只存在于它创建的 SELECT 语句中。
  • 那么在这种情况下,请发布您的整个查询。那么只有我们才能清楚地了解您想要实现的目标。
【解决方案2】:

我不知道有任何 RDBMS 支持您想要的。您将必须编写 8 个 CASE 语句。但是为什么这么浪费呢? 或者你只是懒惰? :)

编辑:

看,当你写SELECT * ... 时,你的RDBMS 正在做的是查询系统表(information_schema 等)并获取表中的列列表。 所以当你写

SELECT CASE WHEN A.num < B.num THEN A.* ELSE B.* END ...

你基本上会写

SELECT CASE WHEN A.num < B.num THEN A.num, A.whatever, A.more, ... ELSE B.num, B.whatever, B.more... END FROM A JOIN B ON A.id=B.id

不幸的是,这是错误的语法。

【讨论】:

  • 我认为这很浪费,因为这意味着一直评估 8 个 Case 表达式而不是 1 :p 它看起来也很糟糕,而且似乎不利于可维护性。
  • 即使你的 * 东西可以工作,所有 8 个都会被评估。仅仅因为你写了一个,并不意味着只有一个。
  • 不知道 enter 会发送评论,所以在我编辑时请耐心等待... 所以选择 CASE WHEN A.num
  • @herojan 更新了我的答案。对不起,这真的没有办法。至少没有,不会比那 8 个 CASE 丑多少。
  • 我害怕那个。我知道 case 语句只占用一列,这就是问题所在。但是我想添加的每一列的相同 case 语句看起来很奇怪。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2013-02-26
  • 2017-06-18
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多