Developer29 Ответов: 3

Порядок по числовому значению в varchar-SQL


У меня есть столбец типа данных int, а другой столбец находится в varchar, и я присоединяюсь к union..

Ток на выходе
1
10
11
2
20
21
Все

Исключенный выход
Все
1
2
10
11
20
21

Что я уже пробовал:

Выберите столбец cast (value as varchar)column1 из таблицы 1
Союз
Выберите столбец " все " 1
Порядок по столбцу 1

itsmypassion

Вы можете использовать CTE

3 Ответов

Рейтинг:
7

itsmypassion

Пожалуйста, попробуйте это

select * from ( select cast( column1 as nvarchar(5)) as column1
from table1
union 
select column1 from table2) as x
order by 
    case 
        when isnumeric(column1) = 1 then cast(column1 as int)
        when isnumeric(left(column1,1)) = 0 then ascii(left(lower(column1),1)) 
        else 2147483647
    end


Graeme_Grant

Вы игнорируете тот факт, что в его структуре таблицы есть изъян. Поправьте пол, и ничего из этого не потребуется, если ваше решение действительно работает.

Кроме того, ваше решение очень неэффективно и ресурсоемко и не исправляет фактическую проблему, а только плохой пластырь для более серьезной проблемы.

itsmypassion

Да, в структуре таблицы есть изъян, а также решение неэффективно.Но это дает ожидаемые результаты.

Graeme_Grant

Таким образом, ваш ответ заключается в том, чтобы использовать больший молоток, а не сначала устранять основную проблему. Лучше устранить причину,чем исправлять проблему. Польза от устранения причины с точки зрения производительности более важна, поэтому я настоятельно рекомендую избегать вашего решения для пластыря.

Developer29

Можете ли вы описать другую часть, к чему она относится?..

CHill60

Вы отметили это как решение! Глупо, если у вас все еще есть вопросы

Рейтинг:
0

Graeme_Grant

ЗАКАЗАТЬ ПО[^] это то, что вам нужно. Нажмите на ссылку, чтобы узнать, как ее использовать. Все остальные ключевые слова SQL можно найти там же с полными примерами.


Developer29

Это не порядок должным образом.... я tried...is есть какое-нибудь другое решение

Graeme_Grant

Он сортирует точно так, как ожидалось, основываясь на том, как вы объявляете значение: cast(value as varchar)column1 Сортировка основана на "типе значения".

Если бы столбец был объявлен как числовое значение (int, float, date и т. д.), то он сортировался бы иначе, чем если бы "тип значения" был текстовой строкой (varchar). Это то же самое для любого языка программирования, а не только для SQL.

Если вы хотите численно отсортировать числовое значение на основе строки (varchar), то вам нужно отсортировать его по длине, а затем по значению. Это не рекомендуется, так как он будет намного медленнее, чем родной "тип значения". Кастинг также имеет стоимость, которая сделает ваш запрос медленным.

Наконец, если вы заказываете столбец, то, чтобы убедиться, что он работает быстро, вы должны иметь настроенный для него индекс.

Рейтинг:
0

CHill60

Если вы передаете эти результаты в слой презентации, то избавьтесь от союз, используйте простой заказать по и добавьте "все" в верхнюю часть списка в пользовательском интерфейсе


Developer29

Я использую в части отчета