使用 CASE 强制 color_code 输出为不同的字符串

Forcing the color_code output to be a different string using CASE

所以我成功地提取了我需要的数据,但是现在的问题是 color_code 是一个不是每个人都知道的 2 位数。因此,为了纠正,我想创建一个 CASE 语句,将这 84 种独特颜色代码中的每一种替换为特定颜色(例如 69 = 海军蓝)。为了获取颜色代码,我在 product_sku.

上使用了 SUBSTRING

我在这里遇到的真正问题是,我试图将我所做的这个 CASE 语句粘贴到我的查询中,但在 CASE 处或附近不断出现语法错误:

(CASE
    WHEN SUBSTRING(product_sku,10,2) = 09 THEN SUBSTRING(product_sku,10,2) = 'Black'
    ELSE 'CHECK THIS SHIET FOO'
    FROM l_nvr_ec_returns
END)

当然,这只是出于测试目的的一种颜色,但我做错了什么?或者也许更重要的是,这个片段到底去了哪里?在我最初的 SELECT 子句之后?求救!

谢谢, Z

在下面的 Caius Jard 的帮助下,这就是我所在的位置。但是出现 "INVALID SYNTAX" 错误

SELECT
    item_name,
    (SELECT
  CASE SUBSTRING(product_sku,10,2)
    WHEN '09' THEN 'Black'
    WHEN '69' THEN 'Navy'
    ELSE 'Unknown Color'
  END as color
FROM l_nvr_ec_returns) color,
    SUM(return_qty) number_of_returns,
    number_of_returns/  
    (SELECT
    SUM(return_qty)
FROM 
    l_nvr_ec_returns
WHERE 
    return_created_date BETWEEN '2019-10-01' AND '2019-10-31'
    AND return_status NOT IN ('Cancelled', 'cancelled')
    AND return_qty > 0
    AND return_reason_desc = 'Color Not As Expected'
) return_rate



FROM 
    l_nvr_ec_returns
WHERE 
    return_created_date BETWEEN '2019-10-01' AND '2019-10-31'
    AND return_status NOT IN ('Cancelled', 'cancelled')
    AND return_qty > 0
    AND return_reason_desc = 'Color Not As Expected'

GROUP BY item_name, color
ORDER BY color

我对 redshift 不是很熟悉,但我认为它是基于 postgres 的。如果您的案例看起来像:

,我希望您的案例能奏效
SELECT
  CASE SUBSTRING(product_sku,10,2)
    WHEN '09' THEN 'Black'
    WHEN '69' THEN 'Navy'
    WHEN ... THEN ...

    ELSE 'Unknown Color'
  END as color
FROM l_nvr_ec_returns

CASE 可以有两种形式:

CASE something
  WHEN another_value_matches_something THEN return_value
  WHEN anotheranother_value_matches_something THEN returnanother_value
  ...

CASE 
  WHEN something = another_value_matches_something THEN return_value
  WHEN something = anotheranother_value_matches_something THEN returnanother_value

您选择哪一个取决于您是在测试相同的东西还是在 运行 不同的真值测试,例如

CASE
  WHEN name = 'John' THEN ...
  WHEN age = 20 THEN ....

CASE 通常必须在其 THEN 之后表示一个值。大多数数据库中的 CASE 不能与不产生值的表达式一起使用

这可行:

WHERE 
  name =
  CASE WHEN age = 2  THEN (SELECT MAX(petname) FROM pets) ELSE 'noname' END

这可能不会:

WHERE 
  name IN
  CASE WHEN age = 2  THEN (SELECT name FROM pets) ELSE (SELECT 'noname') END

这可能是一个语法错误:

WHERE 
  CASE WHEN SUBSTRING(x, 1, 2) = 'ab' THEN SUBSTRING(x, 5, 2) = 'cd' 

我说可能是因为 MySQL 可能会将 SUBSTRING(x, 5, 6) = 'cd' 评估为布尔值,而 return 是真还是假取决于 x 的字符 5 和 6 是否是 cd,但大多数主要数据库不会将其评估为布尔值

我还打算按照 alexherm 的评论添加一些细节。如果可以的话,我会认真考虑使用 84 种颜色值制作一个 table。例如:

--make a table of all our colors
SELECT DISTINCT
  SUBSTRING(product_sku,10,2) as ColorCode,
  'xxxxxxxxxxxxxxxxxxxxx' as ColorName
INTO ColorTable
FROM l_nvr_ec_returns

现在将每一行中的所有 xxxxxxxxx 编辑为正确的颜色名称

将您的大量 CASE 放入此查询中:

SELECT DISTINCT
  SUBSTRING(product_sku,10,2) as ColorCode,
  CASE SUBSTRING(product_sku,10,2)
    WHEN '01' THEN 'Pink'
    WHEN '02' THEN 'Green'
    ...
    WHEN '84' THEN 'Silver'
END as ColorName
INTO ColorTable
FROM l_nvr_ec_returns

这将从一开始就创建所有正确的颜色名称,而无需稍后编辑 table


然后像这样使用它:

SELECT * 
FROM
  l_nvr_ec_returns r
  INNER JOIN colortable c ON SUBSTRING(r.product_sku,10,2) = c.colorcode

仔细编辑您的查询以删除被红色遮盖的字符,留下尾随逗号:

CASE 是应该在 select 列表中使用的表达式,用于将单个 SKU 转换为单个颜色,每行 l_nvr_ec_returns