2010-10-19 69 views
0

我一直在努力创建一个Oracle SQL查询,它会告诉我,如果我的SDO表包含曲线或弧。我知道sdo_elem_info包含我需要的信息,但我不知道如何使用SQL从sdo_elem_info中分离出etype和解释。SQL查询,以确定Oracle空间表是否包含曲线

到目前为止,我已经是:从MY_TABLE TBL选择tbl.shape.sdo_elem_info

+0

我写了一个Python脚本,确定是否表中包含的曲线,但它仍然看起来并不是最有效的回答这个问题的方法... – 2010-10-19 20:52:09

+0

def containsCurves(env,schema,tbl,geom): sql =“select tbl。” +)gems +“.sdo_elem_info from”+ tbl +“tbl” conn = getConn(env,schema) cur = conn.cur() cur.execute(str(sql)) for cur.fetchall如果idx%3 == 0并且(val == 2或val == 4),则id = len(elemInfo): val = elemInfo [idx-1] idm = 1 : return True if idx%2 == 0 and(val == 1005 or val == 2005): return True idx + = 1 return False – 2010-10-19 21:03:38

回答

1

可以使用表函数提取sdo_elem_info_array元素,然后转动那和聚合生成的行以获得每一行元素,带有偏移量,etype和解释的列。

像这样的东西应该给你查询...(警告:未经测试)

WITH elem_info AS (
    SELECT 
    TRUNC((ROWNUM - 1)/3, 0) element_no 
    , MAX(DECODE(MOD(ROWNUM, 3), 1, t.COLUMN_VALUE, NULL)) offset 
    , MAX(DECODE(MOD(ROWNUM, 3), 2, t.COLUMN_VALUE, NULL)) etype 
    , MAX(DECODE(MOD(ROWNUM, 3), 0, t.COLUMN_VALUE, NULL)) interpretation 
    FROM my_table tbl 
    , TABLE(tbl.shape.sdo_elem_info) t 
    GROUP BY TRUNC((ROWNUM - 1)/3, 0) 
) 
SELECT DECODE(COUNT(*), 0, 'false', 'true') 
FROM elem_info ei 
WHERE ei.etype IN (1005, 2005) 
OR ei.interpretation IN (2, 4)