SORU
11 Kasım 2010, PERŞEMBE


() 'UZUNLUĞU vs()

Benim veritabanında 2 tablo var. Bir emir için, bir şirket için.

Emir bu yapıya sahiptir:

OrderID     |     attachedCompanyIDs
------------------------------------
   1                     1,2,3
   2                     2,4

Ve Şirketin bu yapıya sahiptir:

CompanyID      |        name
--------------------------------------
    1                 Company 1
    2                 Another Company
    3                 StackOverflow
    4                 Nothing

Bir emirdir şirketleri isimleri almak gibi bir sorgu yapabilirim:

SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)

Bu sorgu sorunsuz çalışıyor, ancak aşağıdaki sorgu değil.

SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)

Neden ilk sorgu ama ikinci bir işe yaramıyorsa?

İlk sorgu döndürür:

name
---------------
Company 1
Another Company
StackOverflow

İkinci sorgu sadece verir:

name
---------------
Company 1

Bu yüzden, neden ilk sorguda tüm şirketler, ancak ikinci sorgu sadece birinci döndürür döndürmez?

CEVAP
11 Kasım 2010, PERŞEMBE


SELECT  name
FROM    orders,company
WHERE   orderID = 1
        AND companyID IN (attachedCompanyIDs)

attachedCompanyIDs INT (companyID türü) içine dökme olan skaler bir değerdir.

Oyuncuları tek sayılar birinci rakam olmayan (sizin durumunuzda virgül) verir.

Böylece

companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)

PostgreSQL Dizi (ya da ilk etapta bir dizi olarak saklayın): dize döküm olabilir

SELECT  name
FROM    orders
JOIN    company
ON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE   orderID = 1

ve bu bile companyID bir dizin kullanmak istiyorsunuz.

Ne yazık ki, bu ikincisi diziler desteklemiyor beri MySQL çalışmıyor.

Bu makalede ilginç bulabilirsiniz (#2):

Güncelleme:

Eğer virgülle ayrılmış listeler değerler (5 daha fazla) sayısı bazı makul sınırı varsa, bu sorgu kullanmayı deneyebilirsiniz:

SELECT  name
FROM    orders
CROSS JOIN
        (
        SELECT  1 AS pos
        UNION ALL
        SELECT  2 AS pos
        UNION ALL
        SELECT  3 AS pos
        UNION ALL
        SELECT  4 AS pos
        UNION ALL
        SELECT  5 AS pos
        ) q
JOIN    company
ON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • foreignimage

    foreignimage

    13 HAZİRAN 2006
  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009

İLGİLİ SORU / CEVAPLAR