2013-06-04 4 views
3

Вопрос для начинающего здесь ...Использование '?' Параметр в SQL LIKE Statement

Я обращаюсь к базе данных Firebird через Microsoft Query в Excel.

У меня есть поле параметров в Excel, которое содержит 4-значное число. Одна из моих таблиц DB имеет столбец (TP.PHASE_CODE), содержащий 9-значный код фазы, и мне нужно вернуть любой из этих 9-значных кодов, которые начинаются с 4-значного кода, указанного в качестве параметра.

Например, если мое поле параметр содержит «8000», мне нужно найти и вернуть любой код фазы в другой таблице/столбце, LIKE «8000%»

мне интересно, как это сделать в SQL, поскольку это не похоже на «?» представляющий параметр, может быть включен в инструкцию LIKE. (Если я пишу в 4-х цифр, запрос работает нормально, но это не позволит мне использовать параметр там.)

проблематичных утверждений это одна: TP.PHASE_CODE как «%?»

Вот мой полный код:

SELECT C.COSTS_ID, C.AREA_ID, S.SUB_NUMBER, S.SUB_NAME, TP.PHASE_CODE, TP.PHASE_DESC,  TI.ITEM_NUMBER, TI.ITEM_DESC,TI.ORDER_UNIT, 
C.UNIT_COST, TI.TLPE_ITEMS_ID FROM TLPE_ITEMS TI 
INNER JOIN TLPE_PHASES TP ON TI.TLPE_PHASES_ID = TP.TLPE_PHASES_ID 
LEFT OUTER JOIN COSTS C ON C.TLPE_ITEMS_ID = TI.TLPE_ITEMS_ID 
LEFT OUTER JOIN AREA A ON C.AREA_ID = A.AREA_ID 
LEFT OUTER JOIN SUPPLIER S ON C.SUB_NUMBER = S.SUB_NUMBER 

WHERE (C.AREA_ID = 1 OR C.AREA_ID = ?) and S.SUB_NUMBER = ? and TI.ITEM_NUMBER = ? and **TP.PHASE_CODE like '?%'** 

ORDER BY TP.PHASE_CODE 

Любые идеи о альтернативных способов выполнения этого запроса?

Большое спасибо!

ответ

4

Если вы используете `LIKE '?%', То знак вопроса - это буквальный текст, а не заполнитель параметров.

Вы можете использовать LIKE ? || '%', или, альтернативно, если ваш параметр никогда не содержит шаблона LIKE: STARTING WITH ?, который может быть более эффективным, если проиндексированное поле проиндексировано.

+0

Привет, спасибо, кажется, что Firebird ограничен, насколько строковые функции идут, но прежде чем вы ответили, я нашел функцию «подстроки», которая выполнила задание следующим образом: «substring (TP.PHASE_CODE от 1 до 4 знак равно (Ваше решение намного проще!) Еще раз спасибо. – user2452582

+0

@ user2452582 Я не совсем уверен, какие строковые функции связаны с вашим исходным вопросом. Вы можете найти список внутренних функций в http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-intfunc.html –

+0

Привет, Марк, поскольку я не мог найти решение (||) что вы мне дали, я искал строковые функции для извлечения первых 4 цифр, которые мне нужно сравнить с параметром, чтобы ... – user2452582

0

Try String Функции: Left?

WHERE (C.AREA_ID = 1 ИЛИ левый (C.AREA_ID, 4) = "8000")

4

Вы можете сделать

and TP.PHASE_CODE like ? 

но когда вы передаете ваш параметр 8000 к SQL, вы должны добавить за ним %, поэтому в этом случае вы должны передать "8000%" в SQL.

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