5

「人間の」アルファベット順ですが、コンピューターのアルファベット順ではないタイトルの投稿の表があります。これらには、数字とアルファベットの 2 つの種類があります。

  • 数値:図 1.9、図 1.10、図 1.11...

  • アルファベット順:図 1A ... 図 1Z ... 図 1AA

タイトルをorderby付けると、1.10-1.19 は 1.1 と 1.2 の間にあり、1AA-1AZ は 1A と 1B の間にあるという結果になります。しかし、これは私が望んでいるものではありません。1.10 が 1.9 の後に来て、1AA が 1Z の後に来る「人間の」アルファベット順が欲しいです。

文字列操作(または私が考えていないもの)を使用して必要な順序を取得する方法がSQLにまだあるかどうか疑問に思っています。

私はSQLの専門家ではないので、これが可能かどうかはわかりませんが、条件付き置換を行う方法があれば、これを行うことで必要な順序を課すことができるようです:

  1. ピリオドを削除します (これは で実行できますreplaceよね?)

  2. 残りの数字が 3 文字を超える場合は0、最初の文字の後に (ゼロ) を追加します。

これにより、私が望む結果が得られるように思わ1.9109ます1101Zになってしまう10Z、前に来る1AA。しかし、それはSQLで行うことができますか? もしそうなら、構文は何ですか?

データ自体を変更したくないことに注意してください。説明した順序でクエリの結果を出力するだけです。

これはWordpressのインストールのコンテキストにありますが、PHPではなくMySQLクエリ段階で発生する順序にさまざまなもの(ページネーションなど)が依存するため、質問はより適切にSQLの質問だと思います.

4

2 に答える 2

0

私の最初の考えは、トリガーまたは他の外部メカニズムによって更新される列を追加することです。

1)その列を使用して順序付けを行います2)どのメカニズムが更新されても、列にはサロゲートによって受け入れ可能な順序を作成するロジックがあります(たとえば、1.1をAAAなどに変換します)。

とにかく...これは苦痛になるでしょう。私はあなたを否定しません。

于 2012-09-08T14:24:31.027 に答える
0

のような人間の並べ替え順序を持つロジックを持つ関数を作成できます

Alter FUNCTION [dbo].[GetHumanSortOrder] (@ColumnName VARCHAR(50))
RETURNS VARCHAR(20)
AS

BEGIN
DECLARE @HumanSortOrder VARCHAR(20)

SELECT  @HumanSortOrder =
CASE 
    WHEN (LEN(replace(replace(<Column_Name>,'.',''),'Figure ',''))) = 2
THEN
CONCAT (SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),1,1),'0',SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),2,2))
    ELSE
       replace(replace(<Column_Name>,'.',''),'Figure ','')
      END 
FROM    <Table_Name> AS a (NOLOCK)
WHERE   <Column_Name> = @ColumnName

RETURN  @HumanSortOrder

END

この機能は、必要に応じて104、107、119、10A、10Bなどを提供します

そして、この機能を order by として使用できます

 SELECT * FROM <Table_Name> ORDER BY GetHumanSortOrder(<Column_Name>) 

お役に立てれば

于 2012-09-19T07:55:47.467 に答える