タイトルは一口ですが、説明するのが難しいと感じました。
ユーザーが 4 などの検索キーを入力できる以前の Web サービスがあり、その検索キー (4、4a、4b など) で始まるレコードが返されました。
ここで、ユーザーが 4 を入力すると結果が返されるソリューションを実装するように依頼されました。
4
4a
4aa
4b
5
5a
5b
5c
5Z
6
52.
etc..
50 レコードの場合。
クエリの変更をどこから始めればよいかわかりません...検索される列は英数字であり、それが紛らわしいビットです。
クエリ自体は 20 行を超えますが、結果と検索キーをリンクする部分はわずかです。
(col LIKE @searchKey + '[a-zA-Z.]%' OR col = @searchKey OR col >= @searchKey)
そして、要求された順序は次のとおりです。
ORDER BY
CASE WHEN col LIKE '[a-zA-Z]%' Then 1 ELSE 0 END,
CAST(SUBSTRING(col, 0,
CASE WHEN patindex('%[a-zA-Z.]%', col) = 0
THEN len(col)+1
ELSE patindex('%[a-zA-Z.]%', col)
END)
as INT),
CASE WHEN col LIKE '[a-zA-Z]%' THEN SUBSTRING(col, 1,1) END,
CASE WHEN col LIKE '[a-zA-Z]%' AND len(col) = 1 THEN 0 ELSE 1 END,
CASE WHEN col LIKE '[a-zA-Z]%' AND len(col) = 2 THEN 0 ELSE 1 END,
CASE WHEN col LIKE '[a-zA-Z]%' AND len(col) = 3 THEN 0 ELSE 1 END,
col;
たとえば、現在 82 を渡すと、結果が得られます。
8
8A
8B
8E
8H
9
9A
9C
9D
9E
82
82A
82B
82C
.
.
.
.
99R
ただし、ユーザーが 82 と入力すると、8、8x、9、9x などの結果が返されないことが必要です。