2015-12-21 2 views
2

У меня проблема с функцией SUBSTR.ORACLE | Функция SUBSTR не работает

Представьте таблицу (TABLE1):

ABC_DEF DESCRIPTION 
-------- ------------- 
0999  TEST INFO 

Если я сделать этот запрос:

SELECT * FROM TABLE1 
WHERE 
(
    ABC_DEF = '0999' 
) 

Я получаю результаты:

ABC_DEF DESCRIPTION 
-------- ------------- 
0999  TEST INFO 

Однако, если я это сделать :

SELECT * FROM TABLE1 
WHERE 
(
    ABC_DEF = SUBSTR('00000999', 5, 4) 
) 

Получаю 0 результатов. Я вообще не понимаю этого поведения. Атрибут ABC_DEF является символом char (8).

+0

Я использую его в оракула разработчика SQL и он работает мат. Я использую его так, потому что мы тестируем автоматически сгенерированный запрос на .c. EDIT: Вы правы. Моя ошибка при копировании запроса. Это нормальная скобка. – Richasantos

ответ

6

CHAR(8) столбец правой колодки значение с пространством (CHR(32)) символов, пока она не имеет длину 8.

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE table1 (ABC_DEF CHAR(8), DESCRIPTION VARCHAR2(20)); 

INSERT INTO table1 VALUES ('0999', 'TEST INFO'); 

Запрос 1:

SELECT * FROM TABLE1 
WHERE ABC_DEF = '0999' 

Results:

| ABC_DEF | DESCRIPTION | 
|----------|-------------| 
| 0999  | TEST INFO | 

Запрос 2:

SELECT * FROM TABLE1 
WHERE ABC_DEF = SUBSTR('00000999', 5, 4) 

Results:

Запрос 3:

SELECT * FROM TABLE1 
WHERE ABC_DEF = RPAD(SUBSTR('00000999', 5, 4), 8, ' ') 

Results:

| ABC_DEF | DESCRIPTION | 
|----------|-------------| 
| 0999  | TEST INFO | 
+0

Спасибо, помощник. Это действительно решение. Я бы сказал Oracle, что это не имеет смысла. Использование substr в этом примере должно быть равно, чтобы оно было равно значению «0999». Однако, спасибо за объяснение! – Richasantos

+0

Используйте столбец 'VARCHAR2 (8)' вместо столбца 'CHAR (8)'. Первая - это переменная длина, а последняя - фиксированная ширина. – MT0

+0

Отлично! Вот и все. Я тестировал на основе вашего sqlfiddle, и он отлично работает! Еще раз спасибо! – Richasantos

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

  • Нет связанных вопросов^_^