2009-10-05 2 views
0

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

select * from TABLE_A where KEY in (
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824'); 

В основном, внутренний оператор выбора возвращает набор результатов с префиксом «$$». Это используется как ключ поиска в TABLE_A, который не содержит префикса $$ в ключе.

Если я вручную запустить внутреннюю инструкцию:

select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824' 

Скопируйте первый результат, скажем '8462928318772288542' и запустить внешний оператор выбора

select * from TABLE_A where KEY = '8462928318772288542' 

Это работает.

Однако, если я побежал, это как выбор в (select ...) statement, я не получаю результата.

Edit:

База данных, используемая здесь Oracle 10g.

Колонка DYNAMIC_KEY в TABLE_B является VARCHAR2

Ключевой столбец в TABLE_A является ЧАР 32

+0

Какую базу данных вы используете? –

+0

Используемая здесь база данных Oracle 10g – lsiu

ответ

1

Ваша проблема возникает из-за сравнения между типами данных «char (32)» в TABLE_A.KEY и «varchar2» в TABLE_B.DYNAMIC_KEY. Значения в таблице TABLE_A.KEY заполняются пробелами с помощью dbms до определенного размера 32.

Когда вы выполнили подзапрос и скопировали результат во внешний запрос, вы сравнили столбец типа char (32) с литералом string, который dbms обрабатывал как char (32). Смысл, он был пустым, и, таким образом, сравнение сработало.

В исходном запросе вы можете изменить «where KEY in (» на «where trim(KEY) in (», тогда запрос должен работать. Функция trim() возвращает значение varchar2.

+0

Спасибо. Также работала команда trim на Key (столбец char 32). – lsiu

1
SELECT TABLE_A.* 
FROM TABLE_A a 
INNER JOIN TABLE_B b ON a.KEY = b.sbustr(DYNAMIC_KEY,3) 
WHERE b.DYNAMIC_KEY like '$$%' AND b.RECORD_ID='104251893783388824' 
+0

Я думаю, что если вы используете псевдоним TABLE_A как «a», вам нужно использовать псевдоним в списке выбора. Не уверен, что это зависит от базы данных. – Gratzy

+0

Пробовал это и исправил синтаксическую ошибку выше. Это также возвращает пустые результаты. – lsiu

+0

На самом деле это помогло мне решить проблему. Разница в типе столбца, вероятно, является причиной проблемы (varchar2 vs char 32). Чтобы решить эту проблему, я использовал высказывание, предложенное Джоэлом Кохорном с небольшой модификацией. Заменить a.KEY = зиЬзЬг (b.DYNAMIC_KEY, 3) с а.KEY как concat (substr (DYNAMIC_KEY, 3), '%') – lsiu

0

подстроки требует 3 элементы, не два. Также я подозреваю, что существует несоответствие между значением ключа и значением подстроки.

+0

Это не проблема, так как работа внутренних операторов выбора дает правильный результат с удаленным префиксом $$. – lsiu

+0

Собственно, третий параметр substr() является необязательным –

0

Возможно, у вас есть конечные пробелы, которые нужно обрезать на любой колонке? Или, возможно, бросить их обоих в один и тот же тип данных?

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