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

时间:2018-02-16 11:19:41

标签: sql netezza

我有一张表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            |
    +----------------+ 
    

2 个答案:

答案 0 :(得分:1)

它失败了,因为并非所有列都有分号,因此strpos()返回0.您只需添加分号即可解决此问题:

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

答案 1 :(得分:0)

当您尝试使用无效位置执行子字符串时,您的查询失败,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;