Сортировка буквенно-цифрового поля в SQL CE (Compact Edition) версии 3.5

StackOverflow https://stackoverflow.com/questions/4285504

Вопрос

Сортировка буквенно-цифрового поля в 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) и позвоните позже в вашем запросе

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top