【问题标题】:What would be the T-SQL syntax to extract these specific values from an nvarchar column in a Table?从表中的 nvarchar 列中提取这些特定值的 T-SQL 语法是什么?
【发布时间】:2019-11-13 09:19:31
【问题描述】:

我正在使用SQL Server 2014,并且我有一个表 (t1),其中有一个名为 Rank 的列 (nvarchar 类型)。

该列的摘录如下:

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
   ...

我已尝试使用此处提供的解决方案,但我坚持将其转换为满足我的要求:Extract data between delimeter in Nvarchar field

如何使用 T-SQL 做到这一点?

【问题讨论】:

  • 打几个电话CHAR_INDEX 就可以了。但说真的,它应该由脚本语言来完成。
  • 那很糟糕。您需要在 INSERT 期间对数据进行规范化 - 否则您可能会在 T-SQL 中执行此拆分时导致性能不佳。另外,您是否保证明天会插入无效记录(不符合您的初始语法的记录)?
  • @gotqn 谢谢,但是这条记录是从源头“按原样”输入的,我们对其结构没有任何控制权!

标签: sql-server tsql nvarchar


【解决方案1】:

什么是字符串拆分器功能,SQL2016 内置了一个,但对于以前版本的 SQL,您可以使用 Jeff Moden 的 one

这是解决问题的一种方法,它使用字符串拆分器和条件聚合

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

但是,这种方法存在局限性,因为假设 TypeCountry 只是一个词

【讨论】:

  • 如果 OP 使用 sea lodges 而不是 lodges 怎么办?
  • 是的,但我只能按照提供的示例数据进行
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2013-12-09
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多