#sql #sql-server #sapb1
#sql #sql-server #sapb1
Вопрос:
Я использовал этот SQL-запрос для базы данных SAP B1, который должен выполнять разные запросы, в зависимости от группы пользователя:
SELECT CASE
WHEN T0.GroupId = '2'
THEN
(
SELECT T0.Substitute,
T0.ItemCode,
T1.ItemName
FROM OSCN T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
WHERE T0.CardCode = 'CV-1234'
)
ELSE(CASE
WHEN(T0.GroupId = '4')
THEN
(
SELECT T0.ItemCode
FROM OSCN T0
WHERE T0.CardCode = 'CV-1234'
)
ELSE ''
END)
END
FROM OUGR T0
INNER JOIN USR7 T1 ON T1.UserId = T1.UserId
WHERE T1.UserId = 'George'
Но когда я его запускаю, я получаю сообщение об ошибке «В списке выбора может быть указано только одно выражение, когда подзапрос не вводится с помощью EXISTS».
Ценю любую помощь. Заранее спасибо.
Комментарии:
1. Упрощенный
select case when 1=2 then 'a' else (select 1,2) end
вариант Вы просто не можете использовать такой ВАРИАНТ. Можете ли вы объяснить с помощью примеров данных и ожидаемых результатов, чего вы пытаетесь достичь?2. Я использовал этот запрос для форматированного поиска в SAP B1 (вызов службы): в поле ItemCode поля, когда пользователь вводит код элемента и нажимает Tab, запрос должен отображать список результатов, зависит от группы пользователя: — Группа 2: замена (код BP), ItemCode,ItemName — Группа 4: ItemCode, ItemName .
Ответ №1:
вы не можете написать SQL таким образом. Если вы рассматриваете очень простой шаблон SQL:
SELECT a, b
FROM table1
WHERE x = y;
a и b могут быть только отдельными значениями; если вы подумаете об этом, то наличие ‘a’ соответствует нескольким значениям (под которыми я подразумеваю несколько столбцов) не имеет смысла. Не существует такого понятия, как динамический SQL, в котором структура инструкции SQL (или структура ее результата) не определена в момент выполнения или может меняться от строки к строке (вы можете динамически создавать инструкцию SQL, но она фиксирована в момент ее выполнения).
Таким образом, вы можете заменить ‘a’ на любой сложный SQL, какой вам нравится, но этот SQL всегда должен приводить к одному значению.
Не знаю, поддерживается ли оно в вашей среде SAPB1, но обычным способом решения чего-то подобного было бы обернуть его в код (PL / SQL в Oracle, T-SQL в SQL Server и т. Д.) — Таким образом, ваш код определяет, какой из операторов SQL в вашем операторе CASE выполнить, а какой нет.затем просто выполняет этот оператор 1