【发布时间】:2021-06-16 06:12:39
【问题描述】:
只是我上一个主题的延续。 我有桌子:
| id | values |
|---|---|
| 1 | 2;1|3;5|4;8|9;8|10;12 |
| 2 | 0;2|1;3|5;6 |
| 3 | 3;5|1;5|4;7|6;9 |
列值是 varchar,我需要修改,分别获取每个数字
我不在乎是在新列中还是在同一列中作为单独的值。
| id | values |
|---|---|
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 1 | 5 |
| 1 | 4 |
| 1 | 8 |
| 1 | 9 |
| 1 | 8 |
| 1 | 10 |
| 1 | 12 |
或
| id | values | x1 | y1 | x2 | y2 | x3 | y3 | x4 | y4 | x5 | y5 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2;1|3;5|4;8|9;8|10;12 | 2 | 1 | 3 | 5 | 4 | 8 | 9 | 8 | 10 | 12 |
这两种解决方案对我来说都很棒。 我试图在 sql 级别实现这一点,并可能使用 ssis:
SELECT values,
SUBSTRING(values, 1, CHARINDEX(';', values)-1) AS x1,
SUBSTRING(values,1,CHARINDEX(';', values)+1) AS y1
/*CONVERT(float,STUFF(values,1,CHARINDEX(';',values),'')) AS y1
CONVERT(float,LEFT(UserGuid,CHARINDEX(';',UserGuid)-1)) AS x1
,CONVERT(float,LEFT(UserGuid,CHARINDEX(';',UserGuid)-1)) AS x2,
,SUBSTRING(UserGuid, CHARINDEX(';', UserGuid) + 1, 1000) AS y2 */
FROM table
但有人告诉我,这在 sql 级别很难实现。
可能需要使用一些辅助脚本进行此调整,任何想法和建议对我来说都会很棒。 谢谢
【问题讨论】:
-
我建议在 SQL Server 之外进行这项清理工作(例如,使用 Java、PHP、Notepad++ 等),然后重新导入数据。数据库不能很好地处理这个问题。
-
@TimBiegeleisen 和例如一些 python 脚本你认为也可以吗?
-
@DaleK 抱歉,我已经添加了我的问题。我对想法比对解决方案更感兴趣,而不是对解决方案本身感兴趣。所以你不要误会我的意思。
-
@DaleK 当然。但是,例如,当问题无法按照我想要的方式解决时。我必须更改解决方案,但问题仍然存在。在这种情况下,我很高兴收到建议。
标签: python sql sql-server