使用带分号字符的 STRPOS 时出现语法错误或访问冲突

Syntax error or access violation when using STRPOS with semicolon character

我有一个 table table1 具有以下数据

+----------------+
|     model      |
+----------------+
| a45/ a45m;aa45 |
| b34/b34m       |
| c23;c23m/ cc23 |
+----------------+

我正在尝试使用某些规则清理 model 字段,例如

  1. 抓取第一个 ;
  2. 之前的所有字符
  3. 1开始,抓取第一个/
  4. 之前的所有字符

所以我在 netezza 中执行以下步骤 1

SELECT
    SUBSTR(model, 1, STRPOS(model, ';')-1) AS model_clean
FROM table1
;

这将引发错误 ERROR [42000] Syntax error or access violation。知道为什么会这样吗,字符 ; 是否需要转义?

需要注意的是,当我如下查找space字符时,没有错误。

SELECT
    SUBSTR(model, 1, STRPOS(model, ' ')-1) AS model_clean
FROM table1
;

还有没有办法在同一个 select 语句中完成第 2 步?

预期输出

+----------------+
|  model_clean   |
+----------------+
| a45            |
| b34            |
| c23            |
+----------------+ 

它失败了,因为并非所有列都有分号,所以 strpos() returns 0。您可以通过添加分号来解决此问题:

SELECT SUBSTR(model, 1, STRPOS(model || ';', ';') - 1) AS model_clean

当您尝试使用无效位置执行子字符串时,您的查询失败,结果是 strpos 没有找到分号。

您可以使用 case 语句来避免计算无效位置

这里有一个SQLServer语法的例子(charindexstrpos的参数顺序颠倒了,由你来减少查询)http://sqlfiddle.com/#!18/55a6e/25

WITH step1
     AS ( SELECT CASE
                   WHEN CHARINDEX(';', model) > 0 THEN SUBSTRING(model, 1, CHARINDEX(';', model) - 1)
                   ELSE model
                 END AS model
            FROM table1 ),
     step2
     AS ( SELECT CASE
                   WHEN CHARINDEX('/', model) > 0 THEN SUBSTRING(model, 1, CHARINDEX('/', model) - 1)
                   ELSE model
                 END AS model
            FROM step1 )
SELECT *
  FROM step2;