我们可以在 SUBSTRING 中使用 CASE...WHEN 吗?

Har*_*ime 6 sql postgresql

(这是我在工作中遇到的实际难题的一个简单得多的案例)

假设我有一个名为“a”的表,其中有一列名为“col”的列具有以下值(比如长度为 2 且具有许多随机字符组合的列):

上校
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)
Run Code Online (Sandbox Code Playgroud)

(即,如果 'col' 中某事物的第一个字符是 '!'、'@' 或 '#',则将其映射到 'letter' 为 'A',同时保持 'col' 的第二个字符相同并映射该值到“数字”)

If col = '%9', 
    then 'letter' = 'H' and 'number' = '9'
Run Code Online (Sandbox Code Playgroud)

(即,如果 'col' 中的特定值是 '%9',则将其映射到 'letter' 为 'H' 和 'number' 为 '9')

If substring(col FROM 2 for 1) = '4',
    then 'letter' = substring(col FROM 1 for 1) and 'number' = '7'
Run Code Online (Sandbox Code Playgroud)

(即,如果 'col' 中某个值的第二个字符是 '4',则保持第一个字符不变并将其映射到 'letter' 并将第二个字符映射到 'number' 为 '7')

最后,仅选择“字母”是字母且“数字”是单字符数字的值。那是,

'letter' in ('A','B',...'Z') and 'number' in ('0','1',...'9')
Run Code Online (Sandbox Code Playgroud)

我会运行什么查询来解决这个问题?也就是说,使用 CASE..WHEN 对映射进行硬编码?

理想情况下,我正在尝试执行以下操作:

SELECT substring((Case...When) FROM 1 for 1) AS letter,
substring((Case...When) FROM 2 for 1) AS number
FROM a;
Run Code Online (Sandbox Code Playgroud)

谢谢!

rs.*_*rs. 4

尝试这个

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;
Run Code Online (Sandbox Code Playgroud)