0

例えば:

  • アパートの柱101
  • ズズ ドゥルガ インターナショナル ホテル
  • ウィンダム ガーデン フレッシュ メドウズ

上記を次のようにソートする必要があります。

  • 101 ピラーズのアパート
  • ドゥルガ ホテル インターナショナル ズズ
  • フレッシュ ガーデン メドウズ ウィンダム
4

3 に答える 3

6

これを試して:

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 

最終声明

このコードは一種の演習です。あなたのデザインは本当に悪いので、変更する必要があります...

于 2018-01-05T12:33:34.010 に答える
1

したがって、ネイティブにできることは何もありません。戻り値として値を並べ替える場合、つまりデータベース自体を更新しない場合は、ストアド プロシージャまたはおそらくビューのいずれかを使用して結果を変換できます。

それでは、答えを組み立てましょう。

単一の行に対して、視覚的に実行したいと仮定しましょう。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に挿入するときにソートされていることを確認してください。殺すのに数分あったので、私は演習を行いました:)

于 2018-01-05T12:26:29.470 に答える