sql - 如何在 SQL Server 中转换一些记录
问题描述
我有一列具有这样的值:
## codel ##
1-829549-305-117
1-1196585-305-119
119.305.1983984.1 // this record
1-224594-305-121
1-1999987-305-121
122.306.113416.1 // this record
1-158059-305-122
1-1083888-305-126
将 119.305.1983984.1 转换为 1.1983984.305.119 的代码是:
DECLARE @myvar varchar(20);
SET @myvar = '119.305.1983984.1';
SELECT
CONCAT(PARSENAME(@myvar, 1), '-',
PARSENAME(@myvar, 2), '-',
PARSENAME(@myvar, 3), '-',
PARSENAME(@myvar, 4))
输出应该是:
## codel ##
1-829549-305-117
1-1196585-305-119
1-1983984-305-119 // this record has changed
1-224594-305-121
1-1999987-305-121
1-113416-306-122 // this record has changed
1-158059-305-122
解决方案
只需将 替换为-
,.
因为PARSENAME()
仅适用于'.'
,而不适用'-'
WITH TBL AS
(
SELECT '1-829549-305-117' Str
UNION SELECT '1-1196585-305-119'
UNION SELECT '119.305.1983984.1'
UNION SELECT '1-224594-305-121'
UNION SELECT '1-1999987-305-121'
UNION SELECT '122.306.113416.1'
UNION SELECT '1-158059-305-122'
UNION SELECT '1-1083888-305-126'
),
CTE AS
(
SELECT Str,
CASE WHEN CHARINDEX('.', Str) > 0 THEN
Str
ELSE REPLACE(Str, '-', '.')
END Str1
,
CASE WHEN CHARINDEX('.', Str) > 0 THEN '.' ELSE '-' END Sep
FROM TBL
)
SELECT Str,
CONCAT(PARSENAME(Str1,1), Sep,
PARSENAME(Str1,2), Sep,
PARSENAME(Str1,3), Sep,
PARSENAME(Str1,4)
) Result
FROM CTE;
回报:
+-------------------+-------------------+
| Str | Result |
+-------------------+-------------------+
| 1-1083888-305-126 | 126-305-1083888-1 |
| 1-1196585-305-119 | 119-305-1196585-1 |
| 1-158059-305-122 | 122-305-158059-1 |
| 119.305.1983984.1 | 1.1983984.305.119 |
| 1-1999987-305-121 | 121-305-1999987-1 |
| 122.306.113416.1 | 1.113416.306.122 |
| 1-224594-305-121 | 121-305-224594-1 |
| 1-829549-305-117 | 117-305-829549-1 |
+-------------------+-------------------+
如果你有 SQL Server 2017,那么你可以使用CONCAT_WS()
as
SELECT Str,
CONCAT_WS(Sep,
PARSENAME(Str1,1),
PARSENAME(Str1,2),
PARSENAME(Str1,3),
PARSENAME(Str1,4)
) Result
FROM CTE;
如果您希望分隔符始终存在,'-'
则无需Sep
,直接'-'
推荐阅读
- windows - 无法从 echo $PATH 中删除路径
- c++ - 为什么在 Main 中正常运行的代码在函数内部运行不正确?(C++)
- c++ - C++ 中的适配器模式返回分段错误
- mongodb - WSo2 tls 连接到 mongodb 数据服务
- java - slf4j 找不到 log4j2 jar
- vue.js - 如何在vue组件的样式标签中添加if
- discord.js - 我正在尝试发出命令来显示不和谐机器人在多少台服务器上,但得到错误“消息未定义”
- apache-kafka - Kafka Manager - 需要跟踪使用它的用户以确保安全
- android - 形状可绘制是视图之间的共享对象吗
- sql - 在 MS SQL Server 中使用 Pivot?