遍历 table 并更新特定列
Loop through table and update a specific column
我有以下 table:
Id
Category
1
some thing
2
value
这个 table 包含很多行,我想要做的是更新所有类别值以将每个首字母更改为大写。例如,some thing 应该是 Some Thing.
目前我拥有的是:
UPDATE MyTable
SET Category = (SELECT UPPER(LEFT(Category,1))+LOWER(SUBSTRING(Category,2,LEN(Category))) FROM MyTable WHERE Id = 1)
WHERE Id = 1;
但是有两个问题,第一个是尝试将类别值更改为上限,因为只适用于 1 len 个单词(hello=> Hello,hello world => Hello world),第二个是我需要按照 Where Id = X 逻辑 运行 此查询 X 次。所以我的问题是如何更新 X 行?我一直在用光标思考,但我没有太多经验。
这里有一个 fiddle 可以玩。
您可以将单词分开,应用大写字母,然后将单词重新组合在一起。不,您不应该担心子查询和 Id
因为您应该始终将 更新一组行 作为 set-based 操作而不是一次更新一行时间.
;WITH cte AS
(
SELECT Id, NewCat = STRING_AGG(CONCAT(
UPPER(LEFT(value,1)),
SUBSTRING(value,2,57)), ' ')
WITHIN GROUP (ORDER BY CHARINDEX(value, Category))
FROM
(
SELECT t.Id, t.Category, s.value
FROM dbo.MyTable AS t
CROSS APPLY STRING_SPLIT(Category, ' ') AS s
) AS x GROUP BY Id
)
UPDATE t
SET t.Category = cte.NewCat
FROM dbo.MyTable AS t
INNER JOIN cte ON t.Id = cte.Id;
这假设您的类别中没有 non-consecutive 重复项;例如,bora frickin bora
会搞砸(同时 bora bora fickin
会很好)。它还假设一个不区分大小写的排序规则(如果需要可以满足)。
在 Azure SQL 数据库中,您可以使用 STRING_SPLIT()
的新 enable_ordinal
参数,但目前,您必须依赖 CHARINDEX()
等技巧。
- 已更新db<>fiddle(感谢您抢先一步!)
我有以下 table:
Id | Category |
---|---|
1 | some thing |
2 | value |
这个 table 包含很多行,我想要做的是更新所有类别值以将每个首字母更改为大写。例如,some thing 应该是 Some Thing.
目前我拥有的是:
UPDATE MyTable
SET Category = (SELECT UPPER(LEFT(Category,1))+LOWER(SUBSTRING(Category,2,LEN(Category))) FROM MyTable WHERE Id = 1)
WHERE Id = 1;
但是有两个问题,第一个是尝试将类别值更改为上限,因为只适用于 1 len 个单词(hello=> Hello,hello world => Hello world),第二个是我需要按照 Where Id = X 逻辑 运行 此查询 X 次。所以我的问题是如何更新 X 行?我一直在用光标思考,但我没有太多经验。
这里有一个 fiddle 可以玩。
您可以将单词分开,应用大写字母,然后将单词重新组合在一起。不,您不应该担心子查询和 Id
因为您应该始终将 更新一组行 作为 set-based 操作而不是一次更新一行时间.
;WITH cte AS
(
SELECT Id, NewCat = STRING_AGG(CONCAT(
UPPER(LEFT(value,1)),
SUBSTRING(value,2,57)), ' ')
WITHIN GROUP (ORDER BY CHARINDEX(value, Category))
FROM
(
SELECT t.Id, t.Category, s.value
FROM dbo.MyTable AS t
CROSS APPLY STRING_SPLIT(Category, ' ') AS s
) AS x GROUP BY Id
)
UPDATE t
SET t.Category = cte.NewCat
FROM dbo.MyTable AS t
INNER JOIN cte ON t.Id = cte.Id;
这假设您的类别中没有 non-consecutive 重复项;例如,bora frickin bora
会搞砸(同时 bora bora fickin
会很好)。它还假设一个不区分大小写的排序规则(如果需要可以满足)。
在 Azure SQL 数据库中,您可以使用 STRING_SPLIT()
的新 enable_ordinal
参数,但目前,您必须依赖 CHARINDEX()
等技巧。
- 已更新db<>fiddle(感谢您抢先一步!)