当前位置: 首页 > 知识库问答 >
问题:

SQL:如何替换冲突类型联合中的值

红朝
2023-03-14

我在Postgres(使用PostGIS)中有一个表格,其中有几千行,每一行都有统计区域单位(如县)的名称(文本)、代码(文本)、城市(文本)和地理(几何)。几何结构非常完美地镶嵌在一起。

我正在尝试编写一个查询,该查询将选择满足某些条件的所有行,并将其余的行聚合到一行中。对于这一行,我对名称和代码不感兴趣,只对聚合的geom感兴趣。例如,类似这样的内容:

 code | name               |  geom
------+--------------------+---------
 102  | Central Coast      | geo...
 115  | Sydney - Baulkham  | geo...
 116  | Sydney - Blacktown | geo...
 117  | Sydney - City      | geo...
 118  | Sydney - Eastern   | geo...
 000  | Remaining Counties | geo... <---Second SELECT just to get this row

我用这个答案提出了以下内容:

SELECT code, name, ST_Force2D(geom) FROM mytable WHERE mytable.city = 'Greater Sydney' UNION 
SELECT 
  CASE WHEN count(code) > 0 THEN '0' ELSE 'x' END AS code, 
  CASE WHEN count(name) > 0 THEN 'Rest of Sydney' ELSE 'x' END AS name, 
  ST_Collect(geom) 
FROM mytable WHERE mytable.city <> 'Greater Sydney';

这似乎是一种非常迂回和不清楚的方式来完成非常简单的事情。有更好的方法吗?

共有2个答案

堵鸿光
2023-03-14

我不知道这在PostGreSQL中是否可行,因为我已经很多年没有使用过PostGIS了,但是你可以试试:

SELECT
    CASE WHEN city = 'Greater Sydney' THEN code ELSE '000' END AS code,
    CASE WHEN city = 'Greater Sydney' THEN name ELSE 'Remaining Counties' END AS name,
    ST_Collect(geom) AS geom
FROM
    MyTable
GROUP BY
    CASE WHEN city = 'Greater Sydney' THEN code ELSE '000' END,
    CASE WHEN city = 'Greater Sydney' THEN name ELSE 'Remaining Counties' END

由于<code>ST_Collect</code>是一个聚合函数,如果它在一行上聚合,那么它应该只返回该行的几何结构。如果有必要,您可以将其包含在ST_Force2d中,但我不确定是否如此。

严开宇
2023-03-14

您可以硬编码要填充这些单元格的内容。我相信在postgres中,你会用蜱虫做这件事:

SELECT code, name, ST_Force2D(geom) 
FROM mytable 
WHERE mytable.city = 'Greater Sydney'

UNION 

SELECT '0', 'Remaining Countries', ST_Collect(geom) 
FROM mytable 
WHERE mytable.city <> 'Greater Sydney';

您找到的答案补偿零值并用X替换它们。如果您更喜欢在这种情况下看到Xs,您可以这样做。对我来说似乎没有必要。

 类似资料:
  • 问题内容: 我在两个不同的数据库模式中定义了相同的表类型。当我尝试将一个类型的SP作为参数从一个模式调用到另一个模式时,出现以下错误: “操作符类型冲突myCustomType与myCustomType不兼容” 我有以下代码: 类型定义 存储过程定义 执行 我该如何解决这个问题? 问题答案: 您遇到了用户定义表类型的局限性之一。 请参阅此Microsoft Connect项目 ,以“按设计”关闭。

  • 问题内容: 在我的数据库(MySQL的)表中,有一列,并为代表和分别。 但是在中,我需要它替代或在GridView中进行打印。 我如何查询才能做到这一点? 在我当前的表中: 我需要它显示: 问题答案: 您有多种选择: 与域表连接, 布尔 值。 使用(如本答案所示) 或者如果不支持 布尔值 :

  • 问题内容: 当我尝试执行此代码时,在“ with DateDimension”行出现错误: 消息206,级别16,状态2,第15行 操作数类型冲突:日期与int不兼容 这是我正在使用的SQL查询: 问题答案: 您的问题在于该部分。尝试使用,如下所示: 编辑:我不知道您的原始代码是否要使用该选项,但是如果您不知道我建议您阅读此内容。基本上,在这种情况下,这意味着您可以使用CTE列出1,000个日期。

  • fw1在这里使用jar中的logger.java http://anonsvn.jboss.org/repos/common/common-logging-spi/trunk/src/main/java/org/jboss/logging/ fw2在这里使用jar中的logger.java

  • 主要内容:TypeScript,JavaScript,TypeScript,JavaScript,联合类型数组,TypeScript,JavaScript联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。 注意:只能赋值指定的类型,如果赋值其它类型就会报错。 创建联合类型的语法格式如下: 实例 声明一个联合类型: TypeScript var val:string|number val = 12 console.log("数字为 "+ val