我有一张表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 |
+----------------+
答案 0 :(得分:1)
它失败了,因为并非所有列都有分号,因此strpos()
返回0.您只需添加分号即可解决此问题:
SELECT SUBSTR(model, 1, STRPOS(model || ';', ';') - 1) AS model_clean
答案 1 :(得分:0)
当您尝试使用无效位置执行子字符串时,您的查询失败,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;