在SQL select中添加自定义逻辑

时间:2017-03-15 22:28:25

标签: sql oracle

我有要求在哪里显示一个列为Carryover / new。

逻辑如下。

  

如果调色板中存在颜色,则标记列“开发类型”'作为新的其他结转。   我试图使用假设的表结构和simillar查询来设置业务场景。

Pal table

ID  PalName     year
1   Pal 1   2017
2   Pal 2   2016
3   pal 3   2017
4   pal 4   2016
5   pal 5   2017

颜色表

ID  Color name  requestedpalette
1   Red         pal 1, pal 5,
2   Green       na,
3   Black       na,pal 1,pal 3

季节表

ID  Color ID    Palette ID  Season name
1   1                    3  Summer
2   2                    4  Winter

查询

WITH masterdata AS
  (SELECT season name,
          color name,
          season.is AS SeasonID,
          color.id AS ColorID
   FROM season
   INNER JOIN color ON color.id=season.colorid
   INNER JOIN palette ON palette.id=season.paletteid
   WHERE palette.year=2017 )
SELECT colorname,
       CASE
           WHEN EXISTS
                  ( SELECT 1
                   FROM masterdata
                   WHERE ',' || color.requestedpalette LIKE '%,' || masterdata.PalName || ',%' ) THEN 'New'
           ELSE 'Carryover'
       END DevelopmentType
FROM color

有没有更好的方法在不使用WITH的情况下获取上述内容? 如何基于SQL查询中的整个结果集设置列的值

1 个答案:

答案 0 :(得分:0)

尝试:

SELECT color,
  nvl((SELECT distinct 'New'
    FROM pal
    WHERE regexp_like(color.requestedpalette,
      '^([^,]*, *)*' || PalName || '(,.*)*$')
    AND year = 2017
      ), 'Carryover') DevelopmentType
FROM color

你的条款中没有PalName,所以我不认为你的工作原样是什么。由于您只是将请求的选项与PalName进行比较,因此我没有按ID加入所有3个表。如果您只需要具有季节的调色板,请将该表放入子查询列。

真的,在清理dataentry错误之后,您可以将masterdata查询作为子查询移动到主查询中并将其加入

color.requestedpalette LIKE masterdata.PalName || ',%'
or color.requestedpalette LIKE '%, ' || masterdata.PalName || ',%'
or color.requestedpalette LIKE '%, ' || masterdata.PalName
or color.requestedpalette = masterdata.PalName

它将按照您的原始设计工作。

SELECT distinct colorname,
  (case when PalName is not null
  then 'New' else 'Carryover' end) DevelopmentType
FROM color
LEFT JOIN (
  SELECT PalName
  FROM season
  INNER JOIN color ON color.id=season.colorid
  INNER JOIN palette ON palette.id=season.paletteid
  WHERE palette.year=2017
  ) masterdata
ON color.requestedpalette LIKE masterdata.PalName || ',%'
OR color.requestedpalette LIKE '%, ' || masterdata.PalName || ',%'
OR color.requestedpalette LIKE '%, ' || masterdata.PalName
OR color.requestedpalette = masterdata.PalName

2017年3月16日编辑,以说明PalName可能是封闭的PalName的子字符串,或者没有用逗号括在color.requestedpalette中。