2015-01-16 36 views
1

]我們試圖找出是否有類似的函數/方式來指定使用範圍的LIKE條件,而不是使用確切的charector。在TSQL我們能夠通過使用NZSQL/CODE - 如何使用ESCAPE或使用[]指定範圍[

WHERE Col1 LIKE '%[^A-Z]%' 

然後,這會經歷並尋找& Z之間的任何字母,我已經能夠通過在Oracle中使用ESCAPE功能找到類似的方式來做到這一點做到這一點,但一直未能找到TSQL的解決方案。

任何幫助表示讚賞!

回答

2

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 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) 
+0

感謝您的答覆,鑑於ESCAPE會查找特定的字符,有另一種方式來指定一個範圍?本質上,我的列包含數字,然後一些條目在字符5處的A-Z之間有一個字母。在Netezza中是否有指定在該範圍內查找字母的方法? – cryocaustik

+1

不喜歡。這裏唯一支持的元字符是'%',它與任何字符的任何數字(包括零)相匹配,'_'與任何字符中的一個匹配。我更新了答案,以說明具體示例 – ScottMcG

+0

再次感謝, Scott,我一直髮現我們遇到了很多SQL Extensions可以解決的問題,所以我認爲我們可能必須走這條路線。同時,使用BETWEEN'A'和'Z'似乎在做訣竅,因爲它也可以用作不BETWEEN。 再次感謝您的幫助! – cryocaustik