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

时间:2014-05-29 14:55:16

标签: sql postgresql

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

假设我有一个名为'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'中某些内容的第一个字符是'!','@'或'#',则将其映射 把'col'作为'A',同时保持'col'的第二个字符相同 将该值映射到“数字”)

If col = '%9', 
    then 'letter' = 'H' and 'number' = '9'

(即,如果'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'

(即,如果'col'中值的第二个字符为'4',则保留第一个字符 字符不变并将其映射到'letter'并将第二个字符映射到 'number'为'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;

谢谢!

1 个答案:

答案 0 :(得分:2)

试试这个

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;