2010-10-01 5 views
0

У меня есть таблица А с этой колонки:Как запустить запрос по идентификаторам в строке?

IDS(VARCHAR) 
    1|56|23 

мне нужно запустить этот запрос:

select TEST from TEXTS where ID in (select IDS from A where A.ID = xxx) 

TEXTS.ID является INTEGER. Как я могу разбить строку A.IDS на несколько ints для соединения?

Должен работать на MySQL и Oracle. SQL99 предпочтительнее.

+0

Может помочь определить, какой механизм базы данных вы используете. – AlexanderMP

+0

Должен работать над MySQL и Oracle –

ответ

6

Прежде всего, вы не должны хранить данные, подобные этому, в столбце. Вы должны разделить это на отдельную таблицу, тогда у вас будет нормальное соединение, а не эта проблема.

Сказав это, что вы должны сделать, это следующее:

  1. Преобразование числа в строку
  2. раздувания с | (ваш сепаратор) характер, до него, и после него (Я скажу вам, почему ниже)
  3. Pad текст, который вы ищете в с тем же разделителем, до и после
  4. Делают LIKE на нем

Это будет работать медленно!

Вот SQL, который делает то, что вы хотите (предполагая, что все операторы и функции работают в вашем SQL диалекте, вы не говорите, какой двигатель базы данных это):

SELECT 
    TEXT -- assuming this was misspelt? 
FROM 
    TEXTS -- and this as well? 
    JOIN A ON 
     '|' + A.IDS + '|' LIKE '%|' + CONVERT(TEXTS.ID) + '|%' 

причина, почему вам нужно сложить два с разделителем до и после этого: что, если вы ищете номер 5? Вы должны убедиться, что это случайно не поместило бы номер 56, только потому, что в нем была цифра.

В основном, мы будем это делать:

... '|1|56|23|' LIKE '%|56|%' 

Если когда только будет 1 строка в A, он может работать быстрее, если вы сделаете это (но я не уверен, вы должны были бы измерить):

SELECT 
    TEXT -- assuming this was misspelt? 
FROM 
    TEXTS -- and this as well? 
WHERE 
    (SELECT '|' + IDS + '|' FROM A) LIKE '%|' + CONVERT(TEXTS.ID) + '|%' 

Если есть много строк в вашей TEXTS таблицы, то это будет стоят усилий, чтобы добавить код для создания соответствующего SQL с помощью первого извлечения значения из A таблицы, построить соответствующий SQL с IN и использовать этот inst ead:

SELECT 
    TEXT -- assuming this was misspelt? 
FROM 
    TEXTS -- and this as well? 
WHERE 
    ID IN (1, 56, 23) 

Это будет работать намного быстрее, поскольку теперь он может использовать индекс по этому запросу.

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

SELECT 
    TEXT -- assuming this was misspelt? 
FROM 
    TEXTS -- and this as well? 
    INNER JOIN A ON TEXTS.ID = A.ID 

Это будет работать немного медленнее, чем предыдущий, но в предыдущем у вас есть накладные расходы в том, чтобы сначала получить A.IDS, постройте запрос и рискуйте создать новый план выполнения, который должен быть скомпилирован.

+0

+1 для «мы не должны этого делать» :-) –

+1

Исправлено «пропущенное», я понятия не имею, что это такое, должно быть, орфографическое исполнение мисс. –

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