REVERSE
、CHARINDEX
、およびを賢明に使用すると、SUBSTRING
必要なものが得られます。以下のコードでは、何が起こっているのかを説明するために、うまく説明できる列名を使用しています。
サンプル データを設定します。
DECLARE @Invoice TABLE (
InvoiceNumber nvarchar(10)
);
INSERT @Invoice VALUES
('790711')
,('790709-1')
,('790709-11')
,('790709-21')
,('790709-212')
,('790709-2')
SELECT * FROM @Invoice
サンプルデータ:
InvoiceNumber
-------------
790711
790709-1
790709-11
790709-21
790709-212
790709-2
そして、これがコードです。最終的な式が単純化されるのではないかとしつこく感じています。
SELECT
InvoiceNumber
,REVERSE(InvoiceNumber)
AS Reversed
,CHARINDEX('-',REVERSE(InvoiceNumber))
AS HyphenIndexWithinReversed
,SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))
AS ReversedWithoutAffix
,SUBSTRING(InvoiceNumber,1+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS AffixIncludingHyphen
,SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS AffixExcludingHyphen
,CAST(
SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS int)
AS AffixAsInt
,REVERSE(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber)))
AS WithoutAffix
FROM @Invoice
ORDER BY
-- WithoutAffix
REVERSE(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber)))
-- AffixAsInt
,CAST(
SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS int)
出力:
InvoiceNumber Reversed HyphenIndexWithinReversed ReversedWithoutAffix AffixIncludingHyphen AffixExcludingHyphen AffixAsInt WithoutAffix
------------- ---------- ------------------------- -------------------- -------------------- -------------------- ----------- ------------
790709-1 1-907097 2 907097 -1 1 1 790709
790709-2 2-907097 2 907097 -2 2 2 790709
790709-11 11-907097 3 907097 -11 11 11 790709
790709-21 12-907097 3 907097 -21 21 21 790709
790709-212 212-907097 4 907097 -212 212 212 790709
790711 117097 0 117097 0 790711
実際に必要なのはORDER BY
節だけであることに注意してください。残りは私の作業を示すだけです。これは次のようになります。
- 文字列を反転し、ハイフンを見つけ、ハイフンの後の部分文字列を取得し、その部分を逆にします。これは接辞のない数字です
- (接辞のない数字) の長さは、ハイフンを含む接辞を取得するために最初から何文字削除する必要があるかを示します。追加の文字をドロップして数値部分だけを取得し、これを に変換し
int
ます。幸いなことに、この変換では空の文字列がゼロになるという点で、SQL Server とは一線を画しています。
- 最後に、これら 2 つのピースを取得したら、
ORDER BY
(接辞のない数値) を単純化し、次に (接辞の数値) を使用します。これが私たちが求める最終的な注文です。
SUBSTRING(value, start)
SQL Serverがその時点から始まる文字列を取得することを許可していれば、コードはより簡潔になりますが、そうではないためSUBSTRING(value, start, LEN(value))
、多くのことを言わなければなりません。