ms-access-2010 возвращает #func [восклицательный знак] - PullRequest
0 голосов
/ 31 октября 2018

У меня есть SQL-оператор, который включает в себя переключатель, я хочу выполнить на MS-Access-2010.

SQL:

SELECT 
TABLE_1.ID, 
SWITCH
(
    (TABLE_3.ID IN (7,8) AND TABLE_1.SOME_COLUMN = 2), (SELECT MAX(TABLE_4.ID) FROM TABLE_4 WHERE  TABLE_4.TABLE_2_ID = TABLE_2.ID),
    (SELECT MIN(TABLE_4.SOME_COLUMN) FROM TABLE_4 WHERE TABLE_4.TBL_2_ID = TABLE_1.TBL_2_ID)
)AS SOME_ALIAS 
FROM 
    ((TABLE_1 
        LEFT JOIN TABLE_2 ON TABLE_1.TABLE_2_ID = TABLE_2.ID)
        LEFT JOIN TABLE_3 ON TABLE_2.TABLE_3_ID = TABLE_3.ID)

В моем результате столбец some_column всегда равен #Function!

Если я не использую оператор switch и добавляю подвыборы из двух случаев как обычные поля selected следующим образом:

SELECT 
TABLE_1.ID, 
(SELECT MAX(TABLE_4.ID) FROM TABLE_4 WHERE  TABLE_4.TABLE_2_ID = TABLE_2.ID) AS SOME_COLUMN_1,
(SELECT MIN(TABLE_4.SOME_COLUMN) FROM TABLE_4 WHERE TABLE_4.TBL_2_ID = TABLE_1.TBL_2_ID) AS SOME_COLUMN_2
FROM 
    ((TABLE_1 
        LEFT JOIN TABLE_2 ON TABLE_1.TABLE_2_ID = TABLE_2.ID)
        LEFT JOIN TABLE_3 ON TABLE_2.TABLE_3_ID = TABLE_3.ID)

У меня нет проблем (Есть только пара строк, в которых нет значений внутри SOME_COLUMN_1 И SOME_COLUMN_2).

Что вызывает здесь результат #FUNCTION!? 1015 *

1 Ответ

0 голосов
/ 31 октября 2018

Оператор Switch требует четного числа аргументов. Вы передаете только 3 аргумента, что приводит к ошибке.

Вы можете использовать IIF или добавить дополнительный аргумент сравнения (возможно, просто True в качестве 3-го аргумента, если вы хотите вернуть последний аргумент, если первый не соответствует действительности).

SELECT 
TABLE_1.ID, 
IIF
(
    (TABLE_3.ID IN (7,8) AND TABLE_1.SOME_COLUMN = 2), (SELECT MAX(TABLE_4.ID) FROM TABLE_4 WHERE  TABLE_4.TABLE_2_ID = TABLE_2.ID),
    (SELECT MIN(TABLE_4.SOME_COLUMN) FROM TABLE_4 WHERE TABLE_4.TBL_2_ID = TABLE_1.TBL_2_ID)
)AS SOME_ALIAS 
FROM 
    ((TABLE_1 
        LEFT JOIN TABLE_2 ON TABLE_1.TABLE_2_ID = TABLE_2.ID)
        LEFT JOIN TABLE_3 ON TABLE_2.TABLE_3_ID = TABLE_3.ID)
...