1

我需要将一nvarchar(100)列分成三nvarchar(28)列,没有已知的分隔符,也没有中断中间词。我在想我需要找到第 28 个字符附近的空格,测量该空格之前单词的长度和位置,并确定分隔符应该在该单词之前还是之后的天气。然后,再次为第 3 列。从:

科尔
-------------------------------------------------- ----------------------------------
Royal Mission 开放式厨房,带 4 拱门,普通玻璃(标准玻璃搁板)

到:

Col1 Col2 Col3
------------------------------------ ------------- - -------------------------
Royal Mission Open Hutch 4 拱门,普通玻璃(带玻璃搁板 Standa

有任何想法吗?谢谢 nab

我正在使用 SQL 2008

4

1 回答 1

2

使用 CROSS APPLYs,你可以尝试这样的事情:

WITH data (col) AS (
  SELECT CAST('Royal Mission Open Hutch with 4-Arch Doors, Plain Glass (with Glass Shelves Standard)' AS nvarchar(100))
)
SELECT
  col1, col2, col3
FROM data
CROSS APPLY (
  SELECT
    NULLIF(30 - CHARINDEX(' ', REVERSE(LEFT(col, 29))), 0)
) AS x1 (first_space_pos)
CROSS APPLY (
  SELECT
    LEFT(col, ISNULL(first_space_pos, 28)),
    LTRIM(NULLIF(SUBSTRING(col, ISNULL(first_space_pos, 29), 999), ''))
) AS x2 (col1, col23)
CROSS APPLY (
  SELECT
    NULLIF(30 - CHARINDEX(' ', REVERSE(LEFT(col23, 29))), 0)
) AS x3 (second_space_pos)
CROSS APPLY (
  SELECT
    LEFT(col23, ISNULL(second_space_pos, 28)),
    LTRIM(NULLIF(SUBSTRING(col23, ISNULL(second_space_pos, 29), 28), ''))
) AS x4 (col2, col3)
;

第一个 CROSS APPLY 搜索大列前 29 个字符中的最后一个空格,第二个使用找到的位置生成第一个较小的列,col1并将字符串的其余部分返回为col23.

接下来的两个 CROSS APPLY 确实对 执行相同的操作col23,从而产生col2col3。唯一的区别是,最后一个 CROSS APPLY 最多放入col328 个字符,而不是所有剩余的字符。

28像,29和等硬编码值30可以参数化,但我会把这部分工作留给你。

您可以在 SQL Fiddle尝试此查询。

于 2012-07-16T20:50:15.300 回答