我可能会错误地尝试。我正在寻找最好的方法。
要求:
我的查询基于少数字段加入4-5个表。
我有一个名为product id的列。在我的表中有150万行。其中只有10%的行具有带有以下属性的产品ID
A300X-%
A500Y-%
300,500,700是有效的型号。 X和Y是分类。我的查询选择了所有系统。
我有一张支票如下
CASE
WHEN PID LIKE 'A300X%'
THEN 'A300'
...
END AS MODEL
类似地
CASE
WHEN PID LIKE 'A300X%'
THEN 'X'
...
END AS GENRE
我正在寻找下面的最佳选择
CASE WHEN desc in ('AAA') First Case Second Case ELSE don't do anything for other systems END
这有什么正则表达方式吗?在第一次之前 - 拿字符串。寻找X,Y以及300,500,700。
还有其他办法吗?或者通过代码做最好的方法?
有什么建议吗?
修改
示例desc:
AAA,
SoftwARE,
sw-app
我的查询选择了所有的desc。但是这个案子应该只针对AAA运行。
有效型号
A300X-2x-P
A500Y-5x-p
A700X-2x-p
A50CE-2x-P
我只需考虑300,500,700。以上两种情况。
预期结果:
MODEL GENRE
A300 X
A500 Y
A300 Y
答案 0 :(得分:2)
问:如何结合CASE 语句表达式
每个CASE
表达式将返回单个值。如果要求是在结果集中返回两个单独的列,则需要在SELECT列表中使用两个单独的表达式。
例如:
DESC PID model_number genre
---- ---------- ------------ ------
AAA A300X-2x-P 300 X
AAA A500Y-5x-p 500 Y
AAA A700X-2x-p 700 X
AAA A50CE-2x-P (NULL) (NULL)
FOO A300X-2x-P (NULL) (NULL)
需要有一个表达式来返回model_number
列,并使用单独的表达式返回genre
列。
单个表达式无法返回两个单独的列。
问:并添加另外[第三]案件,这将包含这两种情况。
CASE
表达式返回一个值;我们几乎可以在SQL语句的任何地方使用CASE
表达式,我们可以使用一个值,包括在另一个CASE
表达式中。
我们还可以将WHEN
测试中的多个条件与AND
和OR
作为组合条件和嵌套CASE表达式的例子...
CASE
WHEN ( ( t.PID LIKE '_300%' OR t.PID LIKE '_500%' OR t.PID LIKE '_700%' )
AND ( t.DESC = 'AAA' )
)
THEN CASE
WHEN ( t.PID LIKE '____X%' )
THEN 'X'
WHEN ( t.PID LIKE '____Y%' )
THEN 'Y'
ELSE NULL
END
ELSE NULL
END AS `genre`
还有其他表达式会返回相同的结果;这里显示的例子不一定是最好的表达方式。它只是用于组合条件和嵌套CASE表达式的演示。
请注意,要返回另一列model
,我们需要在SELECT列表中包含另一个表达式。类似的情况需要重复;它无法在另一个WHEN
表达式中引用CASE
条件。
答案 1 :(得分:1)
根据您的示例数据,这样的逻辑可以起作用:
(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
THEN SUBSTR(PID, 1, 4)
ELSE PID
END) AS MODEL
(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
THEN SUBSTR(PID, 5, 1)
ELSE PID
END) AS GENRE
这假定“型号”始终以“A”开头,后跟三位数字(如示例数据中所示)。如果型号更复杂,您可能需要regexp_substr()
来提取所需的值。