一尘不染

棘手的SQL与Sql Geometry字段不同

sql

我有一个与该Sql Geometry类型不兼容的sql语句,因此我正在尝试对其进行改版以使其正常工作。

它的基本要旨是这样的:

Select distinct A,B,C,D,SHAPE FROM TABLE1 UNION SELECT A,B,C,D,SHAPE FROM TABLE2

因此,将两个不同(但相似)表上的复杂不同语句的结果合并在一起。

问题在于SQL Geometry类型(SHAPE字段)不能包含在不同的语句中,因为它不是可比较的类型。

我可以SHAPE从参加联合的两个子查询中删除该字段。但是我想在解析完这些子查询后找回它。SHAPE如果我知道A列的值,则可以获取该字段。

所以我的问题是 :如何从两个子查询中的不同语句中删除字段,然后通过将其加入另一列(A)将其返回到结果集中(与其余字段一起)?


阅读 213

收藏
2021-03-08

共1个答案

一尘不染

您可以强制转换为VARBINARY(MAX),然后重新强制转换。

create table tbl1 ( ID int, a int, b char(3), d geometry );
create table tbl2 ( ID int, a int, b char(3), d geometry, other float );
insert tbl1 (ID, a, b, d) values
    (1, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (2, 3, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (3, 4, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (4, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 250 0, 150 150, 0 150, 0 0))', 0)),
    (5, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 350 0, 150 150, 0 150, 0 0))', 0))
insert tbl2 (ID, a, b, d) values
    (6, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)), -- same as tbl1.ID=1
    (7, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 950 0, 150 150, 0 150, 0 0))', 0)),
    (8, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 350 0, 150 150, 0 150, 0 0))', 0)); -- same as tbl1.ID=5

SELECT A, B, cast(c as geometry) c
FROM
(
    Select A,B,cast(D as varbinary(max)) c FROM tbl1
    UNION
    SELECT A,B,cast(D as varbinary(max)) FROM tbl2
) X;
2021-03-08