SQL-запрос (заказ по)

голоса
1

Я хочу, чтобы список (отсортированный список) все мои записи из атрибута называется в моих названии улиц таблицы / реляционные клиентах. например. Я хочу добиться в следующем порядке:

Street_1A
Street_1B
Street_2A
Street_2B
Street_12A
Street_12B

Простой заказ на названия улиц будет делать лексический Comparision, а затем Street_12A и B будет предшествовать Street_2A / B, и это не правильно. Можно ли решить эту проблему чисто SQL?

Задан 09/12/2008 в 16:05
источник пользователем
На других языках...                            


7 ответов

голоса
2

Для справки: это называется Natural сортировки , а есть статья ужаса Coding в теме.

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

Ответил 09/12/2008 в 17:11
источник пользователем

голоса
2

Выберите STREET_NAME из tablex порядке udf_getStreetNumber (STREET_NAME)

в вашем udf_getStreetNumber - написать бизнес-правило для удаления из числа

РЕДАКТИРОВАТЬ

Я думаю, что вы можете использовать регулярное выражение функции в SQL Server в настоящее время. Я просто вырезать все символы, не номерные от входа.

Ответил 09/12/2008 в 16:10
источник пользователем

голоса
1

Если у вас есть доступ на запись к базе данных я бы очень рекомендовал преобразовать все это использовать 3 отдельные поля, а затем использовать их соответствующим образом. Таким образом, вы можете даже сделать это в PHP (да, это займет некоторое время, но это произойдет только один раз). Это может быть какой-то боль, если у вас есть большой базовый код, имеющие проверить для всех запросов с этой таблицей, но, в конечном счете отдающего позже. Например, он будет делать поиск по адресу гораздо проще.

Ответил 09/12/2008 в 16:27
источник пользователем

голоса
1

Я уверен, что вы могли бы разделив на поле StreetName в это разные части с чем-то вроде SubStr (StreetName, 1, найти (»», StreetName)) только на улице и так далее. Но это будет довольно грязными и ему придется иметь дело со всеми видами особых случаев (нет дома, номера дома без добавления) или международными вопросами (в США, как правило Адрес нравится 1 Street).

Но если вы хотите к перебору, как вы описали, и что является важным требованием, было бы лучше, чтобы моделировать вас StreetName в трех частях, т.е. улице (например, «Street»), house_number (например, 1, 2, 12), house_num_addition ( например, "A", "B"). Тогда-то становится тривиальным в SQL.

Ответил 09/12/2008 в 16:15
источник пользователем

голоса
-1

Если это так, что все значения в столбце названия улиц следуют модели StreetName- пространство - StreetNumber

где StreetName может содержать другие пространства, но StreetNumber CAN NOT, то это будет работать:

Declare @T Table (streetName VarChar(50))
Insert @T(streetName) Values('Street 1A')
Insert @T(streetName) Values('Street 2A')
Insert @T(streetName) Values('Street 2B')
Insert @T(streetName) Values('Street 12A')
Insert @T(streetName) Values('Another Street 1A')
Insert @T(streetName) Values('Another Street 4A')
Insert @T(streetName) Values('a third Street 12B')
Insert @T(streetName) Values('a third Street 1C')

Select * From @T 
Order By Substring(StreetName, 0, 1 + len(StreetName) - charIndex(' ', reverse(StreetName))),
       Cast(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)),  
        Case When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 5)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 4)) = 1  Then 4
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 3)) = 1  Then 3
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 2)) = 1  Then 2
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 1)) = 1  Then 1
                End) as Integer),
        Substring(StreetName, len(StreetName) - charIndex(' ', reverse(StreetName)) +
            Case When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 5)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 4)) = 1  Then 6
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 3)) = 1  Then 5
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 2)) = 1  Then 4
             When IsNumeric(Substring(StreetName, 2 + len(StreetName) - charIndex(' ', reverse(StreetName)), 1)) = 1  Then 3
                End, Len(StreetName))
Ответил 09/12/2008 в 16:35
источник пользователем

голоса
-1

Да, это возможно! Но, безусловно, не интересуют! Если вы нашли кого-то здесь готовы потратить несколько часов, записывая и тестирование SP, который будет разделять ваши названия улиц в сочетании StreetName + streetNumber, дай мне свое имя: Я представлю ему несколько проблем, когда я думал, что я должен был заплатить, чтобы получить проделанной работы.

Кстати, вы не можете разделить ваши данные в 2-х полей, один «StreetName» только с названием улицы, и новое поле «buildingNumber»? (Избегайте назвать эту «streetNumber», как в некоторых странах / городах, улицы приведены номера).

Ответил 09/12/2008 в 16:13
источник пользователем

голоса
-2

Надежный способ сделать это (надежен с точки зрения «чтобы правильно сортировать данные», а не «чтобы решить вашу общую проблему»), чтобы разделить данные на название улицы и номер дома и сортировать их обоих на свои собственные. Но для этого необходимо знать, где начинается номер дома. И это самое сложное - сделать предположение лучше всего подходит для ваших данных.

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

Предполагая, что это последняя вещь, в названии улицы, и она содержит ряд:

DECLARE @test TABLE
(
  street VARCHAR(100)
)

INSERT IGNORE  INTO @test (street) VALUES('Street')
INSERT IGNORE  INTO @test (street) VALUES('Street 1A')
INSERT IGNORE  INTO @test (street) VALUES('Street1 12B')
INSERT IGNORE  INTO @test (street) VALUES('Street 22A')
INSERT IGNORE  INTO @test (street) VALUES('Street1 200B-8a')
INSERT IGNORE  INTO @test (street) VALUES('')
INSERT IGNORE  INTO @test (street) VALUES(NULL)

SELECT
  street,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN LEFT(street, LEN(street) - CHARINDEX(' ', REVERSE(street)))
    END
  END street_part,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE 
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1)
    END
  END house_part,
  CASE 
    WHEN LEN(street) > 0 AND CHARINDEX(' ', REVERSE(street)) > 0
    THEN CASE 
      WHEN RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1) LIKE '%[0-9]%'
      THEN CASE
        WHEN PATINDEX('%[a-z]%', LOWER(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1))) > 0
        THEN CONVERT(INT, LEFT(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1), PATINDEX('%[^0-9]%', LOWER(RIGHT(street, CHARINDEX(' ', REVERSE(street)) - 1))) - 1))
      END
    END
  END house_part_num
FROM
  @test 
ORDER BY
  street_part,
  house_part_num,
  house_part

Это предполагает следующие условия:

  • уличный адрес может иметь номер дома
  • дом номер должен быть последним в адрес (не «525 Monroe Av.»)
  • дом номер должен начинаться с цифры , чтобы быть отсортирован правильно
  • дом номер может быть диапазоном ( «200-205»), это будет отсортировано ниже 200
  • дом номер не должен содержать пробелов или распознавания не удается (Когда вы смотрите на ваши данные, вы могли бы применить что - то нравится , REPLACE(street, ' - ', '-')чтобы дезинфицировать общие закономерности заранее.)
  • все это по-прежнему является приближение, безусловно, отличается от того, что она будет выглядеть, как в телефонной книге, например,
Ответил 09/12/2008 в 16:29
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more