页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

(本文档仅供参考) (本文档仅供参考)

问题说明

SQL在数据库软件、测试jsp中是运行正常的,但是在smartbi中却报“表达式解析错误1、SQL在数据库软件、测试jsp中是运行正常的,但是在smartbi中却报“表达式解析错误... ”。
经常存在多个字符拼接在一起的场景。多个特殊字符需要进行拼接,如oracle可以使用||拼接,mysql可以使用concat函数拼接
Oracle:select to_number(regexp_substr('20180721',chr(91)||'0-9'||chr(93)||'*'||chr(91)||'0-9'||chr(93),1)) from dual
mysql:select cast(concat('a',char(92)) as char) from dual

解决方案

Oracle转义示例

...

2、数据集中原生SQL查询带斜杠\的语句 ,预览会报表达式解析错误

Image Added

3、Smartbi里面写SQL,包含正则表达式的时候,读取方括号报错:表达式解析错误: expecting STRING_LITERAL, found '['

例如报错的sql里有两处正则表达式:

代码块
languagesql
linenumberstrue
REGEXP_LIKE(SUBSTR(REPLACE(SUBJECTCODE, '_', ''), 9), '^[a-zA-Z]+')

REGEXP_LIKE(SUBJECTCODE, '11057201_[0-9]{6,}')

解决方案

上述问题是由于SQL中存在特殊符号,需要转义成ASCII码才能使用。

其中上述2中由于 \ 为特殊字符,因此可修改为:

代码块
languagesql
linenumberstrue
select col1, instr(COL1 ,chr(92),1,1) from  LIUJ.TEST 

如下图:

Image Added

上述3中是由于^为特殊字符,可将需要处理的表达式修改为:

代码块
languagesql
linenumberstrue
REGEXP_LIKE(SUBSTR(REPLACE(SUBJECTCODE, '_', ''), 9), chr(94)||'[a-zA-Z]+')

REGEXP_LIKE(SUBJECTCODE, '11057201_[0-9]{6,}')  ------该表达式未使用特殊字符,可正常支持,无需调整。

另外也经常存在多个字符拼接在一起的场景。多个特殊字符需要进行拼接,如oracle可以使用||拼接,mysql可以使用concat函数拼接:

Oracle转义示例

代码块
languagesql
linenumberstrue
select chr(92)||'1XXXX' from dual;
--正则表达式转义
select chr(94)||chr(92)||'d{10}$' from dual
select chr(91)||'0-9'||chr(93)||'*'||chr(91)||'0-9'||chr(93) as a from dual

select to_number(regexp_substr('20180721',chr(91)||'0-9'||chr(93)||'*'||chr(91)||'0-9'||chr(93),1)) from dual;


SELECT REPLACE(CHR(10),'\n') FROM dual
SELECT REPLACE(CHR(10),concat(chr(92),'n'))  as  a  FROM dual

postgresql转义拼接示例

...

Mysql转义示例

代码块
languagesql
linenumberstrue
select cast(concat('a',char(92)) as char) from dual

Postgresql转义拼接示例

代码块
languagesql
linenumberstrue
select cast(concat(char(91),'123',char(93),'hao',char(58))as char) as a

select concat('a','123','hao') as a

select substring('[123]hao:','^\[.+\](.+):');
select substring('[123]hao:',chr(94) || E'\\[.+\\](.+):');

...