例えば:
- アパートの柱101
- ズズ ドゥルガ インターナショナル ホテル
- ウィンダム ガーデン フレッシュ メドウズ
上記を次のようにソートする必要があります。
- 101 ピラーズのアパート
- ドゥルガ ホテル インターナショナル ズズ
- フレッシュ ガーデン メドウズ ウィンダム
例えば:
上記を次のようにソートする必要があります。
これを試して:
DECLARE @tbl TABLE(YourString VARCHAR(100));
INSERT INTO @tbl VALUES
('Pillars 101 in an apartment')
,('Zuzu Durga International Hotel')
,('Wyndham Garden Fresh Meadows');
SELECT CAST('<x>' + REPLACE((SELECT YourString AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML).query
('
for $x in /x
order by $x
return
concat($x/text()[1], " ")
').value('.','varchar(max)')
FROM @tbl;
コードは、テキストを .xml のような XML で最初に転送します<x>Pillars</x><x>101</x> ...
。
次に、 aFLWOR XQuery
を使用して、ソートされたテキスト部分を返します。
を最後に呼び出すと.value()
、ソートされたフラグメントが再びテキストとして返されます。
結果
101 Pillars an apartment in
Durga Hotel International Zuzu
Fresh Garden Meadows Wyndham
このコードは一種の演習です。あなたのデザインは本当に悪いので、変更する必要があります...
したがって、ネイティブにできることは何もありません。戻り値として値を並べ替える場合、つまりデータベース自体を更新しない場合は、ストアド プロシージャまたはおそらくビューのいずれかを使用して結果を変換できます。
それでは、答えを組み立てましょう。
単一の行に対して、視覚的に実行したいと仮定しましょう。SQL 2016 を使用している場合はSTRING_SPLITを使用できますが、SQL Fiddle は使用できないため、一般的な UDF fnSplitStringを使用しました
http://sqlfiddle.com/#!6/7194d/2
SELECT value
FROM fnSplitString('Pillars 101 in an apartment', ' ')
WHERE RTRIM(value) <> '';
それは私に各単語を分割します。注文したらどうですか?
SELECT value
FROM fnSplitString('Pillars 101 in an apartment', ' ')
WHERE RTRIM(value) <> ''
ORDER BY value;
そして、私が持っているDBテーブルの各行に対してそれをしたいのですか? http://sqlfiddle.com/#!6/7194d/8
SELECT split.value
FROM [Data] d
CROSS APPLY dbo.fnSplitString(IsNull(d.Value,''), ' ') AS split
WHERE RTRIM(split.value) <> ''
ORDER BY value;
私の言葉がすべてごちゃ混ぜになっていることを除いて、それは一種の役に立ちます. 元のクエリに戻って、各行を識別しましょう。各行には、おそらく Identity 列があります。もしそうなら、そこにあなたのグループがあります。そうでない場合は、次のように ROW_NUMBER を使用できます。
SELECT
ROW_NUMBER() OVER(ORDER BY d.Value) AS [Identity] -- here, use identity instead of row_number
, d.Value
FROM [Data] d
次に、このクエリを select のサブクエリとして使用すると、次のようになります。
http://sqlfiddle.com/#!6/7194d/21
SELECT d.[Identity], split.value
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY d.Value) AS [Identity] -- here, use identity instead of row_number
, d.Value
FROM [Data] d
) d
CROSS APPLY dbo.fnSplitString(IsNull(d.Value,''), ' ') AS split
WHERE RTRIM(split.value) <> ''
ORDER BY d.[Identity], value;
このクエリは、各 ID 内のすべての行を並べ替えるようになりました。しかし、これらの個々の単語を 1 つの文字列に再構築する必要がありますよね? そのために、 STUFFを使用できます。私の例では、SQL Fiddle の制限により CTEを使用していますが、一時テーブルも使用できます。
WITH tempData AS (
SELECT d.[Identity], split.value
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY d.Value) AS [Identity] -- here, use identity instead of row_number
, d.Value
FROM [Data] d
) d
CROSS APPLY dbo.fnSplitString(IsNull(d.Value,''), ' ') AS split
WHERE RTRIM(split.value) <> ''
)
SELECT grp.[Identity]
, STUFF((SELECT N' ' + [Value] FROM tempData WHERE [Identity] = grp.[Identity] ORDER BY Value FOR XML PATH(N''))
, 1, 1, N'')
FROM (SELECT DISTINCT [Identity] FROM tempData) AS grp
最終結果のフィドルは次のとおりです。http://sqlfiddle.com/#!6/7194d/27
コメントですでに述べたように、これは SQL の一般的なケースではありません。サーバーに不必要な負担がかかります。SQL からデータを取り出し、選択したプログラミング言語で並べ替えることをお勧めします。または、DBに挿入するときにソートされていることを確認してください。殺すのに数分あったので、私は演習を行いました:)