Sql server 从表中的nvarchar列提取这些特定值的T-SQL语法是什么?
我使用的是Sql server 从表中的nvarchar列提取这些特定值的T-SQL语法是什么?,sql-server,tsql,nvarchar,Sql Server,Tsql,Nvarchar,我使用的是SQLServer2014,我有一个表(t1),其中有一列(nvarchartype),名为Rank 本栏摘录如下: Rank #1 of 200 lodges in France #2 of 200 lodges in France ... #175 of 200 lodges in France 我想写一个SELECT语句,它将给我以下输出: Rank Rank2 Type Country #1
SQLServer2014
,我有一个表(t1),其中有一列(nvarchar
type),名为Rank
本栏摘录如下:
Rank
#1 of 200 lodges in France
#2 of 200 lodges in France
...
#175 of 200 lodges in France
我想写一个SELECT语句,它将给我以下输出:
Rank Rank2 Type Country
#1 of 200 lodges in France 1 lodges France
#2 of 200 lodges in France 2 lodges France
#175 of 200 lodges in France 175 lodges France
...
我曾尝试使用此处提供的解决方案,但我一直在转换它以满足我的要求:
如何使用T-SQL实现这一点?什么是字符串拆分器功能,SQL2016内置了一个,但对于SQL的早期版本,您可以使用Jeff Moden提供的功能 这里有一种解决问题的方法,它使用字符串拆分器和条件聚合
DECLARE @t1 TABLE ([Rank] NVARCHAR(100))
INSERT INTO @t1 ([Rank])
VALUES ('#1 of 200 lodges in France'), ('#2 of 200 lodges in France'), ('#175 of 200 lodges in France')
SELECT
T.[Rank]
,Rank2 = MAX(CASE WHEN S.ItemNumber = 1 THEN CONVERT(INT,S.[Item]) END)
,[Type] = MAX(CASE WHEN S.ItemNumber = 4 THEN S.[Item] END)
,[Country] = MAX(CASE WHEN S.ItemNumber = 6 THEN S.[Item] END)
FROM
@t1 T
CROSS APPLY dbo.DelimitedSplit8K(REPLACE(T.[Rank], '#', ''), ' ') S
GROUP BY
T.[Rank]
ORDER BY
Rank2
但是,这种方法存在局限性,因为假设
类型
和国家
只是一个单词调用字符索引
就可以了。但说真的,这应该用脚本语言来完成。那太糟糕了。您需要在插入过程中规范化数据,否则在T-SQL中执行此拆分可能会导致性能不佳。另外,您是否保证明天将插入无效记录(不符合您初始语法的记录)?@gotqn谢谢,但此记录是从源代码“按原样”输入的,我们对其结构没有任何控制权!如果OP没有lodges
,而是sea lodges
,那会怎么样?是的,但我只能根据提供的样本数据来判断