2013-10-03 1 views
0

я должен выбрать данные из таблицы, используя значения столбцов, которые содержат тексты с номерами, например:между оператором, когда диапазон имеет тексты с номерами

"SELECT Title, Category from BookList where CategoryField BETWEEN '" 
    + blockCodeStart + "' AND '" + blockCodeEnd + "'"; 

blockCodeStart = "A25" 
blockCodeEnd = "A39" 

Я понимаю, что и может обрабатывать либо тексты или только цифры, но не оба. Любая помощь оценивается.

+0

Всегда 'A' или один символ следуют некоторые цифры? –

+0

Здесь есть отличная почта: http://stackoverflow.com/questions/9893329/sql-where-criteria-to-find-names-between-a-f. Вы пытаетесь сделать интервал в зависимости от числа или альфы? Очевидно, что в этом случае он будет принимать значения между буквенно-цифровыми значениями. Одна из вещей, которую вы можете сделать, - это разобрать значения, выбирая числовые символы, но это займет много времени в большом наборе данных. Каков ваш ожидаемый результат? – BClaydon

+0

#Paul, это не всегда A. На самом деле тексты варьируются от A до Z. Однако только те же тексты сопровождают два столбца (например, вы всегда получаете «A + число» по сравнению с «A + number» или «D + число "по сравнению с" D + number ", а не" A + number "по сравнению с" B + number ". Я только что нашел это, поэтому похоже, что мне нужно использовать только SQL для выбора чисел в 2 столбцах. Спасибо, всем! # Claydon, я проверю ссылку. Спасибо! –

ответ

0

foo BETWEEN bar AND baz - это просто удобный ярлык для bar <= foo AND foo <= baz. Вы не можете ожидать получения «нормальных» результатов, если вы сравниваете яблоки и апельсины - поскольку вы сравниваете STRINGS, вы получите строковые результаты. Вы не можете ожидать, что БД сможет определить, что A25 больше, чем A9. Это не человек.

Вам придется разложить строки в свои отдельные компоненты и сравнить их как «родные» значения, например.

('A' == 'A') and (25 == 39) 
+0

Согласен. –

0

Если все значения в поле Категория имеют одинаковый формат «LETTER» + «DIGITS», вы можете создать функцию, которая сравнивает категории.

В этом примере я создал и использую схему test.

drop table if exists test.aaa; 
drop function if exists test.natural_compare(s1 character varying, s2 character varying); 

create or replace function test.natural_compare(s1 character varying, s2 character varying) 
returns integer 
as 
$$ 
declare 
    s1_s character varying; 
    s2_s character varying; 
    s1_n bigint; 
    s2_n bigint; 
begin 
    s1_s = regexp_replace(s1, '^([^[:digit:]]*).*$', '\1'); 
    s2_s = regexp_replace(s2, '^([^[:digit:]]*).*$', '\1'); 
    if s1_s < s2_s then 
     return -1; 
    elsif s1_s > s2_s then 
     return +1; 
    else 
     s1_n = regexp_replace(s1, '^.*?([[:digit:]]*)$', '\1')::bigint; 
     s2_n = regexp_replace(s2, '^.*?([[:digit:]]*)$', '\1')::bigint; 

     if s1_n < s2_n then 
      return -1; 
     elsif s1_n > s2_n then 
      return +1; 
     else 
      return 0; 
     end if; 
    end if; 
end; 
$$ 
    language plpgsql immutable; 

create table test.aaa (
id serial not null primary key, 
categ character varying 
); 

insert into test.aaa (categ) values 
('A1'), 
('A2'), 
('A34'), 
('A35'), 
('A39'), 
('A355'), 
('B1'), 
('B6') 
; 

select * from test.aaa 
where test.natural_compare('A34', categ) <= 0 and test.natural_compare(categ, 'A39') <= 0 
+0

Посмотрите мои комментарии выше. Спасибо за ваше время. –

0

Это может быть хорошей отправной точкой:

SQL Fiddle

MySQL 5.5.32 Схема установки:

create table BookList (
id int not null auto_increment, 
Title varchar(10), 
Category varchar(10), 
CategoryField varchar(10), 
    primary key (id) 
); 

insert into BookList (title, Category, CategoryField) values 
('Title1','CAT1','A2'), 
('Title2','CAT2','A7'), 
('Title3','CAT3','A10'), 
('Title4','CAT4','A12'), 
('Title5','CAT5','A25'), 
('Title6','CAT6','A33'), 
('Title7','CAT7','A39'), 
('Title8','CAT8','A50'), 
('Title6','CAT6','B33') 
; 

Запрос 1:

SELECT Title, Category 
from BookList 
where substring(CategoryField,1,1) = 'A' AND 
CONVERT(substring(CategoryField,2), SIGNED) BETWEEN 25 AND 39 

Results:

| TITLE | CATEGORY | 
|--------|----------| 
| Title5 |  CAT5 | 
| Title6 |  CAT6 | 
| Title7 |  CAT7 | 
+0

Я понял, что на каждой строке столбцы имеют похожие алфавиты (например, A всегда пойдите с A, B с B и т. д.). Поэтому я просто уберу алфавиты для каждого столбца и сделаю выбор между оставшимися числами. Потрясающие! Спасибо за ваше время –

Смежные вопросы