2016-01-20 3 views
2

В мс таблицы базы данных SQL files_master У меня есть столбец с именем «AstNum» varchar(100) она содержит данные, такие как: 1/1980 2/1980 11/1980 И так далее, когда я сортировать столбец:Сортировать по столбцам VARCHAR

SELECT AstNum FROM Files_master ORDER BY AstNum ASC 

Он показывает мне записи 1/1980,11/1980 в колонке. /1980 это за год до слэш прибавка номер, пожалуйста, помогите мне, как сортировать записи, которые я хочу в итоге 1/1980 2/1980 3/1980

+0

что это всегда так? или это может быть больше /? НАПРИМЕР. 1/1980/11. и какие dbms вы используете? – sagi

+2

Он работает абсолютно так, как предполагалось. Сортировка стандартных строк считает '11' меньше, чем' 2' и так далее. Если вам нужно, скажите '2/1980', который должен быть выдан до' 11/1980', вероятно, лучше разделить это поле на два и отсортировать соответственно. Также spltting столбец выглядит как лучшая идея с точки зрения дизайна базы данных, поскольку это приводит к более нормализованным данным. В настоящее время ваши значения полей выглядят так, будто вы комбинируете месяц и год в одном столбце строки. –

+0

Я использую MS SQL Server 2014, и данные всегда такие «1/1980, 3000/1980' и т. Д. – user5603158

ответ

3

Попробуйте

Select AstNum from Files_master Order by convert(datetime,'1/'+AstNum,101) ASC 

EDIT: На основе комментариев, вот еще одно решение

Select AstNum from Files_master 
Order by 
parsename(replace(AstNum,'/','.'),2)*1 ASC,parsename(replace(AstNum,'/','.'),1)*1 ASC 
+0

plz chek комментариев – user5603158

+0

gr8 это работает спасибо за ответ – user5603158

+0

Не забудьте сказать: НЕТ ИНДЕКСОВ ИСПОЛЬЗУЕМЫЙ. – TomTom

2

Это будет легко работать не так, и, возможно, также нарушает standard database rules.

Ваш путь - это иметь два столбца, оба типа int, причем один из них является индексом, а другой - годом. Скажем, у вас есть столбцы id и year, ваш запрос будет затем

SELECT `id`, `year` FROM Files_master ORDER BY `id` ASC, `year` ASC 

Обратите внимание, что порядок, в котором перечислены столбцы в ORDER BY заявления зависит от первичного и вторичного столбца порядка, так что, может быть, вы первый хотите заказать по годам.

Если вы действительно, на самом деле, должны использовать этот формат, и только тогда, вы могли бы, вероятно, найти способ использовать SUBSTRING_INDEX разделить вашу строку, а затем что-то вроде (непроверенные):

SELECT SUBSTRING_INDEX(`AstNum`, '/', 1) AS `id`, 
      SUBSTRING_INDEX(`AstNum`, '/', -1) AS `year` 
    ORDER BY `id` ASC,`year` ASC 

Обратите внимание, что это, вероятно, будет довольно медленным для оценки.


Edit: В ответ на комментарий, так как получается, SQL Server используются вместо MySQL (то, что я предполагал, на момент написания статьи) команда должна быть несколько иными, более сложными (до сих пор непроверенного , смещение может быть .. выключено):

SELECT SUBSTRING(AstNum, 1, LEN(AstNum)-5) AS id, 
      SUBSTRING(AstNum, LEN(AstNum)-3, 4) AS year 
    ORDER BY id ASC, year ASC 
+0

Обратите внимание, что используется SQL Server. (Back-ticks и SUBSTRING_INDEX ...?) – jarlh

+0

@jarlh: В то время я написал ответ, который еще не был ясен. Тем не менее, я обновил свой ответ (хотя был принят другой), поэтому он также должен работать с MS SQL Server. – Timm

0

Если вам нужно сортировать по году первым -

SELECT AstNum 
FROM Files_master 
ORDER BY Cast(substring(AstNum, charindex('/', AstNum)+1, 4) as int) ASC, 
     Cast(substring(AstNum, 1, charindex('/', AstNum)-1) as int) ASC 

Если вам нужно сортировать только увеличивают номер мудрых тогдашний

SELECT AstNum 
FROM Files_master 
ORDER BY Cast(substring(AstNum, 1, charindex('/', AstNum)-1) as int) ASC 
Смежные вопросы