NZSQL/CODE-如何使用转义或使用[]指定范围

NZSQL/CODE-如何使用转义或使用[]指定范围,sql,netezza,Sql,Netezza,我们试图找出是否有类似的函数/方法使用范围而不是精确的字符来指定类似的条件。在TSQL中,我们可以通过使用 WHERE Col1 LIKE '%[^A-Z]%' 然后,这将遍历并查找A和Z之间的任何字母。我已经能够通过使用Oracle中的ESCAPE函数找到类似的方法来执行此操作,但还无法找到TSQL的解决方案 感谢您的帮助 Netezza SQL大体上与ANSI SQL 92标准非常接近,在本例中也是如此。唯一支持LIKE的元字符是“%”和“\” SQL扩展工具包有几个正则表达式函数,可以通

我们试图找出是否有类似的函数/方法使用范围而不是精确的字符来指定类似的条件。在TSQL中,我们可以通过使用

WHERE Col1 LIKE '%[^A-Z]%'
然后,这将遍历并查找A和Z之间的任何字母。我已经能够通过使用Oracle中的ESCAPE函数找到类似的方法来执行此操作,但还无法找到TSQL的解决方案


感谢您的帮助

Netezza SQL大体上与ANSI SQL 92标准非常接近,在本例中也是如此。唯一支持LIKE的元字符是“%”和“\”

SQL扩展工具包有几个正则表达式函数,可以通过允许您使用常规正则表达式进行匹配来实现这一点。例如,regex_instr:

select * from regex_table order by col1;                   
COL1
-------
 12340
 12345
 1234A
 1234B
 1234C
 1234a
 1234b
(7 rows)


select * from regex_table where regexp_instr(col1,'\d{4}[A-Z]') > 0 order by col1;
 COL1
-------
 1234A
 1234B
 1234C
(3 rows)
或对于案例不敏感:

select * from regex_table where regexp_instr(col1,'\d{4}[A-Z]','i') > 0 order by col1;
 COL1
-------
 1234A
 1234B
 1234C
 1234a
 1234b
(5 rows)
对于您的特定示例,如果管理员不向您提供SQL扩展工具包,您可以使用标准SUBSTR函数,如下所示:

select * from regex_table where substr(col1,5,1) between 'A' and 'Z' order by col1;
 COL1
-------
 1234A
 1234B
 1234C
(3 rows)
select * from regex_table;
 COL1
------
 %BC
 ABC
(2 rows)

select * from regex_table where col1 like '%BC';
 COL1
------
 %BC
 ABC
(2 rows)

TESTDB.ADMIN(ADMIN)=> select * from regex_table where col1 like '\%BC';
 COL1
------
 %BC
(1 row)

select * from regex_table where col1 like '#%BC' escape '#';
 COL1
------
 %BC
(1 row)
或者,如果希望它不区分大小写:

select * from regex_table where upper(substr(col1,5,1)) between 'A' and 'Z' order by col1;
 COL1
-------
 1234A
 1234B
 1234C
 1234a
 1234b
(5 rows)
使用Netezza,转义子句所能做的就是允许您在希望转义LIKE子句中的元字符时更改转义字符。通常这个字符是“\”。因此,如果希望在LIKE子句中匹配文字“%”,而不是将其作为通配符,则可以在其前面加上“\”前缀。使用转义子句时,您希望使用如下替代字符:

select * from regex_table where substr(col1,5,1) between 'A' and 'Z' order by col1;
 COL1
-------
 1234A
 1234B
 1234C
(3 rows)
select * from regex_table;
 COL1
------
 %BC
 ABC
(2 rows)

select * from regex_table where col1 like '%BC';
 COL1
------
 %BC
 ABC
(2 rows)

TESTDB.ADMIN(ADMIN)=> select * from regex_table where col1 like '\%BC';
 COL1
------
 %BC
(1 row)

select * from regex_table where col1 like '#%BC' escape '#';
 COL1
------
 %BC
(1 row)

感谢您的响应,考虑到转义将查找特定字符,是否有其他方法指定范围?基本上,我的列包含数字,然后一些条目在字符5处有一个介于a-Z之间的字母。Netezza中是否有指定查找该范围内的字母的方法?不适用于LIKE。唯一受支持的元字符是“%”,它与任意数量(包括零)的任何字符匹配,并且_“与任何字符中的一个完全匹配。我更新了答案,针对那个具体的例子。再次感谢你,斯科特。我不断发现,我们遇到了很多可以通过SQL扩展解决的问题,因此我认为我们可能不得不走这条路。同时,使用介于“A”和“Z”之间的符号似乎是一个好办法,因为它也可以用作“NOT-BETWEEN”。再次感谢您的帮助!