通过情况下,当{someCase}然后JSON类型列的PostgreSQL顺序

问题描述 投票:1回答:2

我需要通过一些方法从SELECT命令的结果。它的工作时,它从表TenderItem一些列。但不工作,如果它从JSON类型列TenderItem.ItemInfo,F.E.一些关键

选择从 “ItemInfo” “TenderItem” 为了* - >> '名称'; - 在简单的工作选择

with sortingParams (columnName, isAsc) AS (VALUES ('ItemId', true))
select *
FROM "TenderItem" i, sortingParams
WHERE i."TenderId" = 1
AND  i."ItemInfo" ->> 'Name' like '%Transcend%'
ORDER BY
case
WHEN columnName like '%ItemId%' THEN i."ItemId" --*work
WHEN columnName like '%ABCSegment%' THEN i."ItemInfo" ->> 'ABCSegment' --**
end desc;

**此字符串我有消息“ERROR:BIGINT和文字无法比拟的案例类型”

postgresql
2个回答
0
投票

目前尚不清楚如何你对ItemInfo段ITEMID排序(除非这指向一个项目ID),因为它们是不是所有的文本值(如果它们都是文本,但有些是文本字符串,如“12345”,那么你不要使用文本排序从那时起“100”会来“99”)前。你可能希望他们能单独排序条件排序给予更大的灵活性:

with sortingParams (columnName, isAsc) AS (VALUES ('ItemId', true))
select *
FROM "TenderItem" i, sortingParams
WHERE i."TenderId" = 1
AND  i."ItemInfo" ->> 'Name' like '%Transcend%'
ORDER BY
case
WHEN columnName like '%ItemId%' THEN i."ItemId"::bigint end asc nulls last --puts things with an itemID ahead of those without, or could use nulls first
--if two items have same item id, then sort by segment
, case  
WHEN columnName like '%ABCSegment%' THEN i."ItemInfo" ->> 'ABCSegment' 
end desc;

需要注意的是每个排序条件必须提供相同的数据类型进行评估每一行!这是给你的描述错误的情况下声明给出了一个项目Id咬和ItemInfo ->> 'ABCSegment'文本值


0
投票

项目Id是BIGINTi."ItemInfo" ->> 'ABCSegment'是文本这是不兼容的类型做排序上。

尝试铸造价值明确地BIGINT,即

..WHEN columnName like '%ABCSegment%' THEN (i."ItemInfo" ->> 'ABCSegment')::BIGINT

或者让我。“项目Id”一文,如果上述由于无效bigint值失败。

i."ItemId"::TEXT
© www.soinside.com 2019 - 2024. All rights reserved.