使用 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
所以我成功地提取了我需要的数据,但是现在的问题是 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