我有下表:
| ID | 類別 |
|---|---|
| 1 | 某物 |
| 2 | 價值 |
該表包含很多行,我要做的是更新所有類別值以將每個第一個字母更改為大寫字母。例如,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 行?我在游標中思考,但我沒有太多經驗。
這是一個可以玩的小提琴。
uj5u.com熱心網友回復:
您可以將單詞分開,應用大寫,然后將單詞重新組合在一起。不,您不應該擔心子查詢,Id因為您應該始終將一組行更新為基于集合的操作,而不是一次更新一行。
;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;
這假設您的類別中沒有不連續的重復項;例如,bora frickin bora會搞砸(同時bora bora fickin會很好)。它還假定不區分大小寫的排序規則(如有必要,可以滿足)。
在 Azure SQL 資料庫中,您可以使用新enable_ordinal引數,STRING_SPLIT()但現在,您必須依賴CHARINDEX().
- 更新了db<>fiddle(感謝您的領先!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432416.html
