Поиск строки с пробелами в Oracle SQL Developer - PullRequest
0 голосов
/ 04 октября 2018

предположим, что вы выбираете строку таблицы, которая содержит поле X, равное определенной строке, и эта строка содержит пробелы

, в моем случае у меня есть

select * from table_name where serial = '400 TZV 50'

Iзнаю, что эта запись существует, но запрос возвращает мне пустой набор.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018
select * from table_name where serial = '400 TZV 50'

Я знаю, что эта запись существует, но запрос возвращает мне пустой набор.

Например, если у вас есть записи:

SQL Fiddle

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

CREATE TABLE table_name ( serial VARCHAR2(64) );
INSERT INTO table_name
  SELECT '400 TZV  50' FROM DUAL UNION ALL                      -- Extra space in middle
  SELECT '400 TZV 50 ' FROM DUAL UNION ALL                      -- Extra space at the end
  SELECT '400 TZV 50' || CHR(13) || CHR(10) FROM DUAL UNION ALL -- CR/LF at the end
  SELECT '400' || CHR(9) || 'TZV 50' FROM DUAL;                 -- Tab instead of space

Чтобы найти записи, которые, по вашему мнению, должны совпадать.Вы можете использовать LIKE:

SELECT serial, '400 TZV 50' AS match
FROM   table_name
WHERE  serial LIKE '400%TZV%50%'

или REGEXP_LIKE:

SELECT serial, '400 TZV 50' AS match
FROM   table_name
WHERE  REGEXP_LIKE( serial, '400\s+TZV\s+50\s*' )

, которые оба выдают:

Results :

|       SERIAL |      MATCH |
|--------------|------------|
|  400 TZV  50 | 400 TZV 50 |
|  400 TZV 50  | 400 TZV 50 |
| 400 TZV 50   | 400 TZV 50 |
|              |            |
|   400 TZV 50 | 400 TZV 50 |

, тогда вы можете посмотреть, отличаются ли значения.

Если вы не видите, почему оно не совпадает, используйте функцию DUMP, чтобы получитьбазовые значения байтов в типах данных:

SELECT DUMP( serial ) AS serial, DUMP( '400 TZV 50' ) AS match
FROM   table_name
WHERE  REGEXP_LIKE( serial, '400\s+TZV\s+50\s*' )

Какие выходные данные:

Результаты :

|                                            SERIAL |                                        MATCH |
|---------------------------------------------------|----------------------------------------------|
|    Typ=1 Len=11: 52,48,48,32,84,90,86,32,32,53,48 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
|    Typ=1 Len=11: 52,48,48,32,84,90,86,32,53,48,32 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
| Typ=1 Len=12: 52,48,48,32,84,90,86,32,53,48,13,10 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |
|        Typ=1 Len=10: 52,48,48,9,84,90,86,32,53,48 | Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48 |

И вы можете видеть, что значения разные (игнорируйте значение typ, так как одно является строковым литералом, а другое - VARCHAR2, хранимое в таблице):

  • первоедлина строки отличается от дополнительного пробела в середине:

    Typ= 1 Len=11: 52,48,48,32,84,90,86,32,32,53,48
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                          ^^
    
  • вторая длина отличается от дополнительного пробела в конце:

    Typ= 1 Len=11: 52,48,48,32,84,90,86,32,53,48,32
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                               ^^^
    
  • третий имеет длину, отличную от символов CR / LF в конце:

    Typ= 1 Len=12: 52,48,48,32,84,90,86,32,53,48,13,10
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
               ^^                               ^^^^^^
    
  • , а последняя строка имеет значение ASCII 9 (вкладка)в 4-м символе, когда ASCIIожидается значение 32 (пробел).

    Typ= 1 Len=10: 52,48,48,9,84,90,86,32,53,48
    Typ=96 Len=10: 52,48,48,32,84,90,86,32,53,48
                            ^^
    

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

0 голосов
/ 04 октября 2018

это будет работать:

select * from table_name where serial like '400%TZV%50';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...