SQL sorgusu (sipariş ile)

oy
1

Masamın / ilişki Müşteriler bir özelliği adı Cadde isimleri gelen tüm girdileri (sıralı bir liste) listelemek istiyorum. Örneğin. Aşağıdaki düzeni elde etmek istiyorum:

Street_1A
Street_1B
Street_2A
Street_2B
Street_12A
Street_12B

Cadde isimleri tarafından basit bir düzen daha sonra sözcük karSIlaStIrmasInI ve Street_12A yapacak ve B Street_2A / B öncesi gelecek ve bu doğru değildir. Saf SQL tarafından bu çözmek mümkün mü?

Oluştur 09/12/2008 saat 16:05
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
2

udf_getStreetNumber tarafından tablex siparişinden STREET_NAME seçiniz (STREET_NAME)

senin udf_getStreetNumber içinde - numarasını sıyırma için iş kuralını yazmak

DÜZENLE

Ben artık SQL Server regex işlevselliği kullanabilirsiniz düşünüyorum. Sadece girişten olmayan tüm sayı karakterlerini dışında şerit olurdu.

Cevap 09/12/2008 saat 16:10
kaynak kullanıcı

oy
-1

Evet mümkün! Ama kesinlikle hiçbir ilgi! Burada aşağı yazılması ve bir Sokak adı + streetnumber kombinasyon halinde Cadde isimleri bölecek SP test birkaç saat geçirmek için hazır birilerini bulursanız, bana onun adını vermek: Ona ben almak için ödemek zorunda düşünülen birkaç sorun sunacaktır İş bitti.

Bu arada, olamaz sadece caddenin ismi ve yeni bir 'buildingNumber' alanlı 2 alanlar, bir 'Sokak' verilerinizi bölmek? (Bu bir isim kaçının 'streetnumber', bazı ülkelerde / şehirlerde sokaklar numaraları verilmiştir gibi).

Cevap 09/12/2008 saat 16:13
kaynak kullanıcı

oy
1

Ben sadece sokak ve benzeri için ( "", Sokak) (Sokak, 1, bulmak) bunu substr gibi bir şeyle farklı parçaları var içine Sokak alanını yukarı bölerek eminim. Ama bu oldukça dağınık olacak ve tüm (ilave yapılmaksızın herhangi bir ev numarası, ev numarası) özel durumlarda çeşitleri veya uluslararası sorunlar ile uğraşmak zorunda kalacak (ABD'de, adresleri genellikle 1 Sokak gibi).

Eğer anlatıldığı gibi sıralamaya istiyor ve bu önemli bir gerekliliktir Ama eğer (üç parça, yani sokakta (örneğin, "Sokak"), house_number (örneğin 1, 2, 12), house_num_addition size Sokak modellemek için daha iyi olurdu örneğin "A", "B"). Sonra sıralama SQL önemsiz hale gelir.

Cevap 09/12/2008 saat 16:15
kaynak kullanıcı

oy
1

veritabanına yazma erişimi varsa ben gerçekten uygun bunları kullanarak o zaman bütün 3 ayrı alanlar kullanmak dönüştürme ve öneriyoruz. Hatta PHP yapabileceğini Bu şekilde (evet, bu biraz zaman alacaktır, ancak yalnızca bir kez olur). Bu tabloyla sorgular için kontrol etmek zorunda, büyük bir kod tabanı varsa, bu biraz ağrı olabilir, ama sonunda ödeme-off olacak sonra. Örneğin, adrese göre arama çok daha kolay hale getirecek.

Cevap 09/12/2008 saat 16:27
kaynak kullanıcı

oy
-2

( "Genel sorunu çözmek için" değil "doğru verileri sıralamak için" anlamında güvenilir) bunu yapmak için güvenilir bir yol cadde adı ve ev numarası içine veri bölme ve kendi başlarına ikisi de sıralamak etmektir. Ama bu ev numarası başladığı bilmeden gerektirir. varsayım en iyi verilere uygun hale - Ve bu zor kısmıdır.

Ayrı bir alanda mağaza ev numarası verilerinizi ve bundan refactor Aşağıdaki gibi bir şey kullanmalıdır. o büyük veri setlerini sıralama geldiğinde tüm bu dize-hokkabazlık çok iyi bir performans göstermez.

Bunu varsayarsak sokak adı son şey olduğunu ve bir dizi içerir:

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

Bu durum, bu koşulları varsayılır:

  • bir sokak adresi olabilir bir ev numarasına sahip
  • Bir ev numarası olmalıdır bir sokak adresi son şey (hayır "525 Monroe Av.")
  • Bir ev numarası olmalıdır bir rakam ile başlamak doğru sıralanması için
  • Bir ev numarası olabilir bir aralık ( "200-205"), bu 200'ün altında ayrılacaktır
  • Bir ev numarası olmamalıdır (eğer verilere baktığımızda, bir şey gibi geçerli olabilir boşluk içeremez ve tanıma başarısız REPLACE(street, ' - ', '-')önceden ortak desenleri arındırılamıyor.)
  • Her şey hala kesinlikle örneğin, bir telefon rehberinde nasılolabileceği sapan yaklaşık bir değerdir,
Cevap 09/12/2008 saat 16:29
kaynak kullanıcı

oy
-1

o Cadde isimleri sütundaki tüm değerleri deseni StreetName- boşluk izleyin durumda - streetnumber

nerede Sokak diğer boşluk içerebilir, fakat streetnumber, o zaman bu çalışacaktır 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))
Cevap 09/12/2008 saat 16:35
kaynak kullanıcı

oy
2

Kayıt için: denir Doğal Sıralama Düzeni ve orada Kodlama korku makale konuda.

Ben kod bazı buraya gösterdi kullanarak SQL yapabiliriz sanırım, ama o durum senaryosunda bir durumda her zaman tarafından olacak.

Cevap 09/12/2008 saat 17:11
kaynak kullanıcı

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