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

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

Другие вопросы по тегам