2012-02-08 2 views
0

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

A_1 
A_2 
A_3 
A1 
A2 
A3 
B_1 
B_2 
B_3 
B1 
B2 
B3 

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

select * from test_table where column_A like 'A\_*' escape '\'; 

так что _ не рассматривается как один шаблона символа. я могу получить A_1, A_2 и A_3.

Как мне сделать, когда я хочу использовать это в промежутке между оператором и оператором? например

select * from test_table where column_A between 'A_\*' and 'B_\*' 

Я пробовал вышеуказанный, он не избежал _. если добавить право бежать после того, как условие

select * from test_table 
where column_A between 'A_\*' escape '\' and 'B_\*' escape '\' 

или

select * from test_table 
where column_A between 'A_\*' and 'B_\*' escape '\' 

я получил ошибку синтаксиса.

+1

На самом деле нет смысла избегать символов с операторами сравнения, потому что эти операторы не рассматривают ЛЮБОЙ характер как специальный. Нет символов подстановочных знаков с 'BETWEEN', поэтому не нужно их избегать. Что вы ожидаете, что ваш запрос вернется, это действительно не ясно. –

ответ

2

BETWEEN не , кажется, разрешения экранирование маски , использующих этот синтаксис ; Я предполагаю, что вы получаете ORA-00933: команда SQL не была закончена? (Всегда полезно указывать ошибку, которую вы видите). Это хотя допускает альтернативный синтаксис:

select * from test_table 
where column_A between 'A[_]%' and 'B[_]%'; 

Edit На самом деле, хотя синтаксис разрешен, он ничего не делает; BETWEEN не относится к _ как к шаблону, хотя он относится к % как к одному.

Edit 2 Как @Allan отметил, что на самом деле не обрабатывает % в качестве шаблона, это просто, как характер упорядочения работ.

Я не уверен, что это именно то, чего вы на самом деле хотите, так как это даст вам A_1, A_2, A_3, B1, B2, B3 (по крайней мере, с моими параметрами NLS).

Если то, что вы на самом деле хотите, A_1, A_2, A_3, B_1, B_2, B_3, то вы можете использовать REGEXP_LIKE вместо этого, что-то вроде:

select * from test_table 
where regexp_like(column_A, '^([AB])_'; 

(хотя я с удовольствием отложить другим на лучший способ построить это).

+1

Я не думаю, что 'между' фактически обрабатывает% в качестве подстановочного знака. Я верю, что он возвращает эти результаты, потому что числовые значения падают после знака процента в таблице символов. Это также объясняет, почему значения «B_1» и т. Д. Не возвращаются. – Allan

+0

@ Аллан - да, конечно. D'о. Я думал, что он должен рассматривать это как подстановочный знак, потому что он все еще нашел записи, но вы правы, это просто потому, что '%' имеет более низкое значение ASCII (или unicode), чем alphanumerics. Спасибо что подметил это. –

2

Вы не можете избежать символов с операторами сравнения, потому что с этими операторами нет подстановочных знаков. Я не думаю, что BETWEEN является правильным оператором для этой задачи.

Кажется, что вы хотите, чтобы все строки начинались с буквы между A и B и сопровождались _. Я бы посоветовал вам взглянуть на regexp_like, что более гибко, чем оператор LIKE. Например, вы могли бы написать:

SQL> WITH test_table AS (
    2  SELECT 'A_1' column_A FROM dual 
    3  UNION ALL SELECT 'A_2' FROM dual 
    4  UNION ALL SELECT 'A_3' FROM dual 
    5  UNION ALL SELECT 'A1' FROM dual 
    6  UNION ALL SELECT 'A2' FROM dual 
    7  UNION ALL SELECT 'A3' FROM dual 
    8  UNION ALL SELECT 'B_1' FROM dual 
    9  UNION ALL SELECT 'B_2' FROM dual 
10  UNION ALL SELECT 'B_3' FROM dual 
11  UNION ALL SELECT 'B1' FROM dual 
12  UNION ALL SELECT 'B2' FROM dual 
13  UNION ALL SELECT 'B3' FROM dual 
14 ) 
15 SELECT * FROM test_table 
16 WHERE regexp_like (column_A, '^[A-B]_.*'); 

COLUMN_A 
-------- 
A_1 
A_2 
A_3 
B_1 
B_2 
B_3 
Смежные вопросы