pymssql:当列具有 XML 值时如何获取不同的行
pymssql : How to get distinct rows when a column has XML values
我正在尝试在具有 XML 值的 table 的查询中使用 distinct。这是我的查询
select distinct pID,docXml from docTable where docXml is not null and pID not like '%xyz%'
但我明白了
pymssql.OperationalError: (421, 'The xml data type cannot be selected as DISTINCT because it is not comparable.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n')
如何解决这个问题?这是什么意思?
docXml 列中的数据看起来像
<document>
<pages>
<page>
<paragraph>XBV</paragraph>
<paragraph>GFH</paragraph>
</page>
<page>
<paragraph>ash</paragraph>
<paragraph>lplp</paragraph>
</page>
</pages>
</document>
请注意,如果我不使用 distinct,那么我可以轻松获取所有数据。但由于有重复项,我只对唯一行感兴趣。
你可以试试
CONVERT(NVARCHAR(MAX), docXml)
在 select 语句中(也许将整个内容放在 CTE 中,然后将其从 CTE 转换回 XML)例如
; WITH T AS (select distinct pID,CONVERT(NVARCHAR(MAX), docXml) docXml from docTable where docXml is not null and pID not like '%xyz%')
SELECT pID, CONVERT(XML, docXml) FROM T
或者,如果您的 pID 本身是不同的(这样每个 pID 都与一个 docXml 相关),您可以在其 XML 格式。例如
; WITH T AS (select pID
,docXml
,ROW_NUMBER() OVER (PARTITION BY pID ORDER BY pID) RN
from docTable
where docXml is not null
and pID not like '%xyz%')
SELECT pID, docXml FROM T WHERE RN = 1
编辑:至于为什么要这样做,SQL 不喜欢对 CLOB 进行排序
我正在尝试在具有 XML 值的 table 的查询中使用 distinct。这是我的查询
select distinct pID,docXml from docTable where docXml is not null and pID not like '%xyz%'
但我明白了
pymssql.OperationalError: (421, 'The xml data type cannot be selected as DISTINCT because it is not comparable.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n')
如何解决这个问题?这是什么意思?
docXml 列中的数据看起来像
<document>
<pages>
<page>
<paragraph>XBV</paragraph>
<paragraph>GFH</paragraph>
</page>
<page>
<paragraph>ash</paragraph>
<paragraph>lplp</paragraph>
</page>
</pages>
</document>
请注意,如果我不使用 distinct,那么我可以轻松获取所有数据。但由于有重复项,我只对唯一行感兴趣。
你可以试试
CONVERT(NVARCHAR(MAX), docXml)
在 select 语句中(也许将整个内容放在 CTE 中,然后将其从 CTE 转换回 XML)例如
; WITH T AS (select distinct pID,CONVERT(NVARCHAR(MAX), docXml) docXml from docTable where docXml is not null and pID not like '%xyz%')
SELECT pID, CONVERT(XML, docXml) FROM T
或者,如果您的 pID 本身是不同的(这样每个 pID 都与一个 docXml 相关),您可以在其 XML 格式。例如
; WITH T AS (select pID
,docXml
,ROW_NUMBER() OVER (PARTITION BY pID ORDER BY pID) RN
from docTable
where docXml is not null
and pID not like '%xyz%')
SELECT pID, docXml FROM T WHERE RN = 1
编辑:至于为什么要这样做,SQL 不喜欢对 CLOB 进行排序