我有下表:

Id Category
1 some thing
2 value

这个表包含很多行,我想做的是更新所有类别值,将每个第一个字母都改为大写.例如,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,因为您应该始终将updating a set of rows作为基于集合的操作来处理,而不是一次处理一行.

;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数据库中,您可以使用新的enable_ordinal参数设置为STRING_SPLIT(),但目前,您必须依赖CHARINDEX()之类的黑客.

Sql相关问答推荐

如何转换和汇总行数

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

当一个视图在Postgres中失效时?

将重复的值更新为下一个空闲数字

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

如何查找所提供日期范围的所有季度开始日期和结束日期

过go 四周未填充的数据,即W50,51,52-SQL

在PostgreSQL中汇总连接表中的 case 值

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

存储过程太慢

获取上个月和上一年的值

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

如何根据 SQL Server 中 1 条语句中 SELECT 的结果进行 INSERT 或 UPDATE

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

使用 SQL 计算一年中任意 3 个月期间的总成本

按公司和产品查询最近发票的平均价格的SQL查询

编写查询以根据级别 (p2) 返回父位置

忽略与给定列匹配的行的 LAG 函数

SQL:获取连接表的第一个项目

在 Snowflake SQL 中计算通货inflating 率