我们可以在 SUBSTRING 中使用 CASE...WHEN 吗?
Posted
技术标签:
【中文标题】我们可以在 SUBSTRING 中使用 CASE...WHEN 吗?【英文标题】:Can we use a CASE...WHEN inside SUBSTRING? 【发布时间】:2014-05-29 14:55:15 【问题描述】:(这是我在工作中遇到的实际难题的一个更简单的案例)
假设我有一个名为“a”的表,其中有一个名为“col”的列,其中包含以下值(比如一个长度为 2 的列,其中包含许多随机字符组合):
col A3 D2 @5 #) ...我想使用一个 select 语句,它输出名为“letter”和“number”的两列,其中“letter”是“col”的第一个字符,“number”是“col”的第二个字符,但使用以下映射:
If substring(col FROM 1 for 1) in ('!','@','#'),
then letter = 'A' and 'number' = substring(col FROM 2 for 1)
(即,如果 'col' 中某些内容的第一个字符是 '!'、'@' 或 '#',则映射它 将“字母”作为“A”,同时保持“col”的第二个字符相同,并且 将该值映射到“数字”)
If col = '%9',
then 'letter' = 'H' and 'number' = '9'
(即,如果 'col' 中的特定值是 '%9',则将其映射到 'letter' 作为 'H' 和 '数字' 为 '9')
If substring(col FROM 2 for 1) = '4',
then 'letter' = substring(col FROM 1 for 1) and 'number' = '7'
(即,如果 'col' 中的值的第二个字符是 '4',则保留第一个字符 字符不变并将其映射到“字母”并将第二个字符映射到 '数字'作为'7')
最后,只选择 'letter' 为字母且 'number' 为 1 的值 字符编号。也就是说,
'letter' in ('A','B',...'Z') and 'number' in ('0','1',...'9')
我会运行什么查询来解决这个问题?也就是说,使用 CASE..WHEN 对映射进行硬编码?
理想情况下,我正在尝试做类似的事情:
SELECT substring((Case...When) FROM 1 for 1) AS letter,
substring((Case...When) FROM 2 for 1) AS number
FROM a;
谢谢!
【问题讨论】:
请编辑问题以显示示例数据和所需结果。这对其他人理解逻辑很有帮助。 我已经编辑了 OP 以使其更加明确。 仍然很难跟上。输入 -> 输出的一些映射可能非常有用。总的来说,听起来您只需要一系列替换规则 - 可能一个或多个正则表达式会很好。 我用输入->输出问了一个先前的问题,但答案不是我要求的格式(子字符串中的 CASE..WHEN)。这是我的问题的更通用形式:假设您有一个包含两个字符的列“col”。我想要一个 SELECT 语句,它将“col”中的值分成两列——一个用于“col”的第一个和第二个字符,但具有某些条件/替换/排除。 【参考方案1】:试试这个
SELECT * FROM (
SELECT
CASE
WHEN SUBSTRING(COL from 1 for 1) IN ('!','@','#') THEN 'A'
WHEN COL LIKE '%9' THEN 'H'
WHEN SUBSTRING(COL,2,1) = '4' THEN SUBSTRING(COL,1)
END Letter,
CASE
WHEN SUBSTRING(COL from 1 for 1) IN ('!','@','#') THEN substring(col FROM 2 for 1)
WHEN COL LIKE '%9' THEN '9'
WHEN SUBSTRING(COL,2,1) = '4' THEN '7'
END Number
FROM A
)
WHERE (Letter ~ '^[A-Za-z]$') = true AND (Number ~ '^[0-9]$') = true;
【讨论】:
谢谢,这正是我想要的! :)以上是关于我们可以在 SUBSTRING 中使用 CASE...WHEN 吗?的主要内容,如果未能解决你的问题,请参考以下文章
我在存储过程sql中使用CASE条件对中间首字母进行分割双字符
freeCodeCamp:Title Case a Sentence