NZSQL/CODE - 如何使用 ESCAPE 或使用 [] 指定范围
NZSQL/CODE - How to use a ESCAPE or Specify a Rang using []
我们正在尝试找出是否有类似的 function/way 来使用范围而不是精确的字符来指定 LIKE 条件。在 TSQL 中,我们能够通过使用
来完成此操作
WHERE Col1 LIKE '%[^A-Z]%'
这将遍历并查找 A 和 Z 之间的任何字母。我已经能够通过使用 Oracle 中的 ESCAPE 函数找到类似的方法来执行此操作,但未能找到 TSQL 的解决方案.
感谢任何帮助!
Netezza SQL 总体上非常接近 ANSI SQL 92 标准,在这种情况下绝对如此。 LIKE 支持的唯一元字符是“%”和“_”。
SQL Extension Toolkit 有几个正则表达式函数,可以通过允许您使用通用正则表达式进行匹配来实现这一点。例如,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 where upper(substr(col1,5,1)) between 'A' and 'Z' order by col1;
COL1
-------
1234A
1234B
1234C
1234a
1234b
(5 rows)
对于 Netezza,ESCAPE 子句将为您做的只是允许您在想要转义 LIKE 子句中的元字符时更改转义字符。通常这个字符是'\'。因此,如果您想在 LIKE 子句中匹配文字“%”而不是将其作为通配符,您可以在其前面加上“\”。使用 ESCAPE 子句希望您使用这样的替代字符:
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)
我们正在尝试找出是否有类似的 function/way 来使用范围而不是精确的字符来指定 LIKE 条件。在 TSQL 中,我们能够通过使用
来完成此操作WHERE Col1 LIKE '%[^A-Z]%'
这将遍历并查找 A 和 Z 之间的任何字母。我已经能够通过使用 Oracle 中的 ESCAPE 函数找到类似的方法来执行此操作,但未能找到 TSQL 的解决方案.
感谢任何帮助!
Netezza SQL 总体上非常接近 ANSI SQL 92 标准,在这种情况下绝对如此。 LIKE 支持的唯一元字符是“%”和“_”。
SQL Extension Toolkit 有几个正则表达式函数,可以通过允许您使用通用正则表达式进行匹配来实现这一点。例如,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 where upper(substr(col1,5,1)) between 'A' and 'Z' order by col1;
COL1
-------
1234A
1234B
1234C
1234a
1234b
(5 rows)
对于 Netezza,ESCAPE 子句将为您做的只是允许您在想要转义 LIKE 子句中的元字符时更改转义字符。通常这个字符是'\'。因此,如果您想在 LIKE 子句中匹配文字“%”而不是将其作为通配符,您可以在其前面加上“\”。使用 ESCAPE 子句希望您使用这样的替代字符:
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)