Сортировка буквенно-цифровых полей в SQL CE (Compact Edition) версии 3.5 - PullRequest
3 голосов
/ 26 ноября 2010

Сортировка буквенно-цифровых полей в 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

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Хорошо, это решение уродливо, и не для слабонервных. Я не тестировал SQL CE, но он использует только базовый t-sql, так что все должно быть в порядке. Вам нужно будет создать таблицу подсчета (просто запустите его первый блок кода, если вы не хотите его читать. Он использует базу данных tempdb, так что вы захотите это изменить), и таблицу держать каждую букву алфавита (из-за отсутствия функций сопоставления с образцом). После создания таблицы подсчета (вам не нужно переходить к 11000, как показано в примере), запустите их, и вы увидите желаемое поведение сортировки

Создание таблицы алфавита (временная для демонстрационных целей):

select *
into #alphatable
from
(

select 'A' as alpha union all
select 'B' union all
select 'C' union all
select 'D'
--etc. etc.
) x

Создание таблицы дерева (временная для демонстрационных целей):

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 

Это в основном техника, которую Моден описывает как «пошаговое прохождение символов», затем каждый символ объединяется в таблицу альфа. Строки без строки в альфа-таблице являются числовыми.

1 голос
/ 16 декабря 2010

Функции поддерживаются в CE? Вы можете создать свою собственную функцию IsNuemric (например, простой анализ по типу char) и вызвать ее позже в своем запросе

...