类似于Postgresql数据问题中的运算符条件

时间:2018-10-17 11:14:33

标签: sql sql-server postgresql

我表中有以下数据

HJ-DEF-ABCF010-ABC18-09-17-D
GHJ-ABC-ABFV006-ABC18-09-18-R
OH-DEF-ABFCRT2037-ABC17-01-18-R

我想在另一列中填充值

HJ-DEF-ABCF010-ABC18-09-17-D             BET
GHJ-ABC-ABFV006-ABD18-09-18-R            BET
OH-DEF-ABFCRT2037-ABCD17-01-18-R          BET

作为

的映射
ABC18 is BET   
ABD18 is BET
ABCD17 is BET

我正在使用下面的SQL查询

select col1,case 
when col1 like '%-ABC[1-2][0-9]-%' then BET 
when col1 like '%-ABD[1-2][0-9]-%' then BET 
when col1 like '%-ABCD[1-2][0-9]-%' then BET
else - end form table

在SQl服务器上工作正常,但在Pogresql中我们无法使用[1-2]来找出该位置的期望数字。关于Posgresql如何实现的任何建议或想法。

3 个答案:

答案 0 :(得分:3)

效果很好。但是,出于某种原因,您认为LIKE支持字符类和其他类似正则表达式的功能。在Postgres中,或者在除SQL Server,Sybase和MS Access之外的任何其他数据库中,都不是真的。

只需使用正则表达式即可。

对于原始版本:

SELECT *
FROM Customers
WHERE Customerid ~ '^[1-2][1-1]'; 

对于已编辑的版本:

SELECT *
FROM Customers
WHERE Customerid ~ '[-].{3}[1-2]1'; 

答案 1 :(得分:3)

您实际上可以通过一些工作使当前的逻辑与LIKE一起工作:

SELECT *
FROM Customers
WHERE Customerid LIKE '11%' OR Customerid LIKE '21%';

您似乎正在使用SQL Server或Sybase增强的LIKE语法。 Postgres不支持此功能,但是它支持自己的~正则表达式运算符。有关更多信息,请参见戈登的答案。

对问题的修改可以使用以下方法:

SELECT *
FROM Customers
WHERE Customerid ~ '-[^-]{3}[1-2]7';

Demo

答案 2 :(得分:0)

与SIMILAR TO一起使用,而不是像。选择col1,如果col1与'%-AB([CD] | CD)[1-2] [0-9]-%'类似,然后下注BET-结束表格thnx @WiktorStribiżew