ما هي أفضل طريقة لتحديد حقول السلسلة على أساس الطابع يتراوح?

StackOverflow https://stackoverflow.com/questions/152537

سؤال

أنا بحاجة لإضافة قدرة المستخدمين من البرمجيات لتحديد السجلات قبل حرف نطاقات.
كيف يمكنني كتابة الاستعلام بإرجاع جميع الحاجيات من جدول اسمه يندرج في نطاق با بي على سبيل المثال ؟

حاليا أنا أستخدم أكبر من وأقل من المشغلين ، لذلك في المثال أعلاه سوف تصبح:

select * from widget
where name >= 'ba' and name < 'bj'

لاحظ كيف يجب "زيادة" آخر حرف من الحد العلوي من i إلى j حتى أن "الدراجة" لن تكون مستبعدة.

هل هناك generic طريقة للعثور على الحرف التالي بعد حرف استنادا إلى حقل ترتيب أو سيكون أكثر أمانا لإنشاء الثاني الشرط ؟

select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')

بلدي التطبيق يحتاج إلى دعم التعريب.مدى حساسية هذا النوع من الاستعلام إلى أحرف مختلفة?

أنا أيضا بحاجة إلى دعم كل MSSQL و أوراكل.ما هي الخيارات المتاحة من أجل ضمان الطابع غلاف تجاهلها بغض النظر عن اللغة التي تظهر في البيانات ؟

هل كانت مفيدة؟

المحلول

دعونا القفز مباشرة إلى التعريب.تقول "aa" >= "با" ?ربما لا, ولكن هذا هو حيث أنه يفرز في السويد.أيضا, كنت ببساطة لا يمكن أن نفترض أن يمكنك تجاهل غلاف في أي لغة.غلاف صراحة تعتمد لغة, مع المثال الأكثر شيوعا التركية:كبيرة أنا هو أنا.صغيرة أنا هو ı.

الآن, SQL DB يحدد نتيجة <, == وما إلى ذلك من قبل "ترتيب النظام".هذا هو بالتأكيد لغة معينة.لذا يجب التحكم بشكل صريح هذا كل استعلام.تركي ترتيب النظام سوف يضع هذه أنا التي تنتمي إليها (باللغة التركية).لا يمكنك الاعتماد على الترتيب الافتراضي.

أما عن "العلاوة جزءا" لا تزعج نفسك.التمسك >= ، <=.

نصائح أخرى

بالنسبة MSSQL انظر هذا الموضوع: http://bytes.com/forum/thread483570.html .

Oracle, ذلك يعتمد على Oracle الإصدار Oracle 10 يدعم الآن regex(ع) مثل الاستفسارات: http://www.psoug.org/reference/regexp.html (البحث عن regexp_like ) و راجع هذه المقالة: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

محبط, Oracle فرعية دالة SUBSTR(), في حين أنه SQL Server انها فرعية().

يمكن أن تكتب بسيطة التفاف حول واحد أو كل منهم بحيث تتقاسم نفس اسم وظيفة + النموذج.

ثم يمكنك فقط استخدام

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'

أو ما شابه ذلك.

هل يمكن استخدام هذا...

select * from widget
where name Like 'b[a-i]%'

هذا سوف تتطابق مع أي صف فيها اسم يبدأ ب الحرف الثاني في مجموعة أ ، و أي شخصيات أخرى تتبع.

أعتقد أن أذهب مع شيء بسيط مثل إلحاق عالية الفرز السلسلة إلى نهاية العلوي.شيء من هذا القبيل:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'

أنا لست متأكدا من شأنها أن البقاء على قيد الحياة EBCDIC التحويل على الرغم من

يمكنك أيضا أن تفعل ذلك من هذا القبيل:

select * from widget
where left(name, 2) between 'ba' and 'bi'

إن المعايير الخاصة بك طول التغييرات (كما أشرت في تعليق لك على اليسار) الاستعلام سوف تحتاج إلى أن يكون طول كمدخل أيضا:

declare @CriteriaLength int
set @CriteriaLength = 4
select * from widget
where left(name, @CriteriaLength) between 'baaa' and 'bike'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top