我要选择连接的字符串,最多255个字符。不作任何缩短的原始查询为:
SELECT
b.title
||
CASE
WHEN b.subtitle != '' THEN '. ' || b.subtitle
ELSE ''
END
||
CASE
WHEN b.cover = 'paperback' THEN ' P'
WHEN b.cover = 'hardcover' THEN ' K'
WHEN b.cover = 'spiral' THEN ' S'
ELSE ''
END
||
CASE
WHEN b.year > 0 THEN ' ' || b.year
ELSE ''
END
||
CASE
WHEN b.volume > 0 THEN ' ' || b.volume || '. osa'
ELSE ''
END
||
CASE
WHEN p.name != '' THEN ' ' || p.name
ELSE ''
END
AS name
FROM table b
JOIN table_p p
ON b.id = p.foreign_id;
规则:串联的字符串最多可包含255个字符
优先字段:
b.title
(文本,最多250个字符),b.cover
(2个字符),b.year
(4个字符+空格= 5),b.volume
(int <100 +附加字符串'。osa'= 7-8个字符)。不太重要:
b.subtitle
(文本,最多250个字符),p.name
(文本,最多150个字符)除b.title之外的所有字段都可能不存在/为空。
我能想到的一种方法:因为三个短的必填字段(cover
,year
,volume
)最多可以为15个字符,其他所有字段都可以为最大240个字符。由于p.name
并不那么重要,如果需要的话,我可以将其连接并剪切。因此,此方法的主要目标是:b.title
+ b.subtitle
必须适合240个字符。看起来像这样:
SELECT
SUBSTR(
SUBSTR( b.title
||
CASE
WHEN b.subtitle != '' THEN '. ' || b.subtitle
ELSE ''
END,
0, 240 )
||
CASE
WHEN b.cover = 'paperback' THEN ' P'
WHEN b.cover = 'hardcover' THEN ' K'
WHEN b.cover = 'spiral' THEN ' S'
ELSE ''
END
||
CASE
WHEN b.year > 0 THEN ' ' || b.year
ELSE ''
END
||
CASE
WHEN b.volume > 0 THEN ' ' || b.volume || '. osa'
ELSE ''
END
||
CASE
WHEN p.name != '' THEN ' ' || p.name
ELSE ''
END,
0, 255 ) AS name
FROM table b
JOIN table_p p
ON b.id = p.foreign_id;
这种方法还可以。
我的问题:有没有更好的方法来控制这种级联的各个方面?
我正在使用Postgresql 9.6