如何在特殊规则下连接cols?

时间:2019-05-10 16:40:56

标签: sql postgresql

我要选择连接的字符串,最多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之外的所有字段都可能不存在/为空。

我能想到的一种方法:因为三个短的必填字段(coveryearvolume)最多可以为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

0 个答案:

没有答案