我有要求在哪里显示一个列为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查询中的整个结果集设置列的值
答案 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中。