DB2 11.5下如何用SQL查询验证SQL语句文本是否含*等特殊字符
问题描述
需要编写SQL查询验证给定的SQL语句文本是否包含星号*,示例目标SQL语句如下:
Insert into PERSON (PERSONID,STATUS,DISPLAYNAME,EMPLOYEETYPE) values ('JACOB','ACTIVE','Jacob',(select * from user where userid='JACOB'))
该SQL语句仅作为文本验证,不存储在表中。尝试了以下语句但出现语法错误(DB2版本为DB2/LINUXX8664 11.5):
WITH Query AS ( SELECT 'Insert into PERSON (PERSONID,STATUS,DISPLAYNAME,EMPLOYEETYPE) values (''JACOB'',''ACTIVE'',''Jacob'',(select * from user where userid=''JACOB''))' AS QueryText)SELECT CASE WHEN LOCATE('*' IN QueryText) > 0 THEN 'Contains *' ELSE 'Does not contain *' END AS result FROM Query;
正确实现方案
错误根源在于LOCATE函数的语法使用有误,DB2中LOCATE函数的正确格式是LOCATE(要查找的字符串, 目标字符串),不需要IN关键字。修正后的单条语句验证SQL如下:
WITH Query AS ( SELECT 'Insert into PERSON (PERSONID,STATUS,DISPLAYNAME,EMPLOYEETYPE) values (''JACOB'',''ACTIVE'',''Jacob'',(select * from user where userid=''JACOB''))' AS QueryText ) SELECT CASE WHEN LOCATE('*', QueryText) > 0 THEN 'Contains *' ELSE 'Does not contain *' END AS result FROM Query;
如果需要批量验证多条SQL语句,可扩展CTE部分添加多行数据:
WITH Query AS ( SELECT 'Insert into PERSON (PERSONID,STATUS) values (''JACOB'',''ACTIVE'')' AS QueryText, '语句1' AS label UNION ALL SELECT 'Insert into PERSON (PERSONID,STATUS,DISPLAYNAME) values (''JACOB'',''ACTIVE'',''Jacob'',(select * from user where userid=''JACOB''))' AS QueryText, '语句2' AS label ) SELECT label, CASE WHEN LOCATE('*', QueryText) > 0 THEN 'Contains *' ELSE 'Does not contain *' END AS result FROM Query;
内容的提问来源于stack exchange,提问作者max092012
相关产品推荐
相关产品推荐

