我需要通过几种方法选择结果。 当它是表TenderItem中的某些列时,它可以工作。 但是如果它来自json类型列TenderItem.ItemInfo,f.e.
从“ TenderItem”顺序中的“ ItemInfo”->>“名称”中选择*; -简单选择即可工作
al:web:should_fallback
**在此字符串上,我收到消息“错误:案例类型bigint和文本无法匹配”
答案 0 :(得分:0)
ItemId为BIGINT
,而i."ItemInfo" ->> 'ABCSegment'
是文本,它们是不兼容的类型,无法进行排序。
尝试将值显式转换为BIGINT
,即
..WHEN columnName like '%ABCSegment%' THEN (i."ItemInfo" ->> 'ABCSegment')::BIGINT
如果由于无效的bigint
值而导致上述操作失败,则将i。“ ItemId”设为文本。
i."ItemId"::TEXT
答案 1 :(得分: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;
请注意,每个排序条件必须为要评估的每一行提供相同的数据类型!这就是您所描述的错误的原因,其中case语句为ItemId加上了一个ItemInfo ->> 'ABCSegment'