使用带分号字符的 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
开始,抓取第一个/
之前的所有字符
所以我在 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语法的例子(charindex
和strpos
的参数顺序颠倒了,由你来减少查询)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;
我有一个 table table1
具有以下数据
+----------------+
| model |
+----------------+
| a45/ a45m;aa45 |
| b34/b34m |
| c23;c23m/ cc23 |
+----------------+
我正在尝试使用某些规则清理 model
字段,例如
- 抓取第一个
;
之前的所有字符
- 从
1
开始,抓取第一个/
之前的所有字符
所以我在 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语法的例子(charindex
和strpos
的参数顺序颠倒了,由你来减少查询)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;