Сортировка буквенно-цифрового поля в SQL CE (Compact Edition) версии 3.5
-
28-09-2019 - |
Вопрос
Сортировка буквенно-цифрового поля в SQL CE (Compact Edition) версии 3.5
Treenumber - это поле Nvarchar с сочетанием номеров и строк для значений. Я хочу отсортировать эти записи, чтобы записи, которые содержат альфа-символы, находящиеся в верхней части, а остальные сортируются в числовом порядке.
Я хочу что-то похожее на следующий запрос, который работает на SQL Server:
SELECT * FROM Tree
ORDER BY
(CASE WHEN TreeNumber LIKE '%[a-z]%' THEN 0 ELSE TreeNumber END), TreeNumber
Вышеуказанный запрос не работает, потому что диапазон [] не поддерживается в CE. Другое решение, которое работает с SQL Server, но не работает в CE, потому что «Isnumber ()» не поддерживается ниже:
SELECT * FROM Tree
ORDER BY
(CASE IsNumeric(TreeNumber) WHEN 0 THEN 0 ELSE TreeNumber END), TreeNumber
Решение
Хорошо, это решение некрасиво, а не для слабого сердца. Я не проверил на SQL CE, но он использует только базовый T-SQL, поэтому он должен быть в порядке. Вам придется создать Таблица (Просто запустите свой первый блок кода, если вы не хотите его читать. Он использует TempDB, поэтому вы захотите изменить это), а таблицу для удержания каждой буквы алфавита (из-за отсутствия сопоставления Функции). После создания таблицы подсветки (вам не нужно проходить до 11000, как пример показывает), запустите их, и вы увидите поведение, которое вы хотите сортировки
Создайте таблицу алфавита (TEMP для демократических целей):
select *
into #alphatable
from
(
select 'A' as alpha union all
select 'B' union all
select 'C' union all
select 'D'
--etc. etc.
) x
Создайте таблицу дерева (TEMP для демонстрационных целей):
select *
into #tree
from
(
select 'aagew' as TreeNumber union all
select '3' union all
select 'bsfreww' union all
select '1' union all
select 'xcaswf'
) x
Решение:
select TreeNumber
from
(
select t.*, tr.*, substring(TreeNumber, case when N > len(TreeNumber) then len(TreeNumber) else N end, 1) as singleChar
from tally t
cross join #tree tr
where t.N < (select max(len(TreeNumber)) from #tree)
) z
left join
#alphatable a
on z.singlechar = a.alpha
group by TreeNumber
order by case when max(alpha) is not null then 0 else TreeNumber end
Это в основном методика, которую моден описывает как «выходя через символы», то каждый символ соединен на альфа-таблице. Ряды без ряда в альфа-таблице являются числовыми.
Другие советы
Функции поддерживаются в CE? Вы можете сделать свою собственную несуенную функцию (например, простой символ Char By Char Parser) и позвоните позже в вашем запросе