1

既知の区切り記号を使用せず、単語の途中で改行せずに、nvarchar(100)列を 3 つの列に分割する必要があります。nvarchar(28)28 番目の文字に近いスペースを見つけ、そのスペースの直前にある単語の長さと位置を測定し、区切り文字がその単語の前後にある必要があるかどうかを判断する必要があると考えています。それではまた3列目です。から:

コル
-------------------------------------------------- -----------------------------------
ロイヤル ミッション オープン ハッチ 4 アーチ扉、プレーン ガラス (ガラス棚標準付き)

に:

Col1 Col2 Col3
------------------------ ------------------------- - -------------------------
ロイヤル ミッション オープン ハッチ 4-アーチ ドア、無地ガラス (ガラス棚スタンド付き)

何か案は?ありがとうナブ

SQL 2008 を使用しています

4

1 に答える 1

2

CROSS APPLY を使用すると、次のようなことを試すことができます。

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 文字の最後のスペースを検索し、2 つ目の CROSS APPLY は見つかった位置を使用して最初の小さな列を生成しcol1、残りの文字列を として返しますcol23

次の 2 つの CROSS APPLY は に対して同じ操作を実行し、 とcol23を生成col2col3ます。唯一の違いは、最後の CROSS APPLY がcol3、残りのすべての文字ではなく、最大 28 文字になることです。

28、 、29などのハードコードされた値30はパラメーター化できますが、その部分の仕事はあなたに任せます。

このクエリは SQL Fiddle で試すことができます。

于 2012-07-16T20:50:15.300 に答える