SQL WHERE IN Предложение, возвращающее без строк при сравнении с вложенными функциями (команда Crystal Reports с базой данных SQL-92)
Я пытаюсь разграничить переменную Crystal Reports в своем запросе SQL от имени пользователя, чтобы он мог предоставить ввод в формате "customer1, customer2, customer 3"
против "'customer1', 'customer2', customer3'"
, Я могу отформатировать строку от имени пользователя, передав параметр Crystal Reports REPLACE()
а также CONCAT()
функции в моем запросе. Когда я помещаю код в список выбора, строка форматируется соответствующим образом для использования в IN
выражение. Однако запрос не возвращает строк после переноса кода в IN
пункт. Я скопировал и вставил вывод из списка выбора в IN
оператор и строки возвращаются, как ожидалось. Я попытался выполнить тот же код в своем клиенте SQL для строкового литерала вместо параметра, что привело к тем же результатам, что означает, что это не относится к Crystal Reports.
select
customer.custid,
customer.name
from pub.customer
where customer.custid IN (
CONCAT('''', CONCAT(RTRIM(LTRIM(
REPLACE('{?customer_param}', ',', ''','''))), '''')))
Код просто заменяет запятые на "," и добавляет одинарную кавычку в начале и конце значения параметра. В моем списке выбора код возвращает: "customer1", "customer2".
Я понимаю, что этот метод не идеален с точки зрения производительности.
Стандарт драйвера SQL (соответствие стандарту SQL-92, уровень 1 через ODBC) БД: 32-разрядный дБ хода (собственный ABL со слоем абстракции SQL) Приложение: Epicor 9.05
1 ответ
Результат вашего CONCAT(...)
это строка Чтобы то, что вы пытаетесь сделать, работало, его нужно будет интерпретировать как код SQL. Это не произойдет.
Вы могли бы пойти по-другому. Если ваша база данных имеет LOCATE()
функция или что-то подобное для поиска подстроки в строке, тогда вы можете написать условие фильтра следующим образом:
WHERE LOCATE(
CONCAT(',', customer.custid, ','),
CONCAT(',', '{?customer_param}', ',')) != 0
Обводка запятыми вокруг всего гарантирует, что вы сопоставляете только полные строки, и обеспечивает совпадение первой и последней строк в списке.