2015-09-01 2 views
1

Я использую ниже запрос в Ms Access. И это дает мне ошибку Syntax error in your query expression CASE WHEN not .... Не могли бы вы рассказать мне, что я делаю неправильно? В Sql Server 2008 R2 оператор case работает правильно.case statement in MS Access query дать ошибку

SELECT TableApron.RadButtonNo, TableApron.ShortName, QueryForNot1.InspectionDate, QueryForNot1.Findings, QueryForNot1.Status, QueryForNot1.Initials, TableApron.DeptName, TableApron.Lost, TableApron.InServelDate, TableApron.RemovedDate, TableApron.PrivateUserName, TableApron.PrivateUserEmail, TableApron.ApronType, TableApron.Manufacturer 
FROM TableApron LEFT JOIN QueryForNot1 ON TableApron.RadButtonNo=QueryForNot1.RadButtonNoI 
WHERE (((TableApron.Lost)="N" Or (TableApron.Lost)=[@Lost]) And ((TableApron.InServelDate) Is Null Or (TableApron.InServelDate) Between CDATE([@From]) And CDATE([@To]) Or (TableApron.InServelDate)<CDATE([@To])) And ((TableApron.RemovedDate) Is Null Or (TableApron.RemovedDate) Between CDATE([@From]) And CDATE([@To]) Or (TableApron.RemovedDate)>CDATE([@To]))) 
ORDER BY 
CASE 
     WHEN not TableApron.RadButtonNo like '%[^0-9]%' THEN CONVERT(int,TableApron.RadButtonNo) 
     WHEN TableApron.RadButtonNo like '[0-9]%' THEN CONVERT(int,SUBSTRING(TableApron.RadButtonNo,1,PATINDEX('%[A-Z]%',TableApron.RadButtonNo)-1)) 
    END, 
    CASE 
     WHEN not TableApron.RadButtonNo like '%[^0-9]%' THEN NULL 
     WHEN TableApron.RadButtonNo like '[0-9]%' THEN SUBSTRING(TableApron.RadButtonNo,PATINDEX('%[A-Z]%',TableApron.RadButtonNo),9000) 
     ELSE TableApron.RadButtonNo 
    END; 
+1

CASE - T-SQL. Замените выражение IIf (условие, true, false). – Gustav

ответ

1

CASE оператор запускает первый сообщила об ошибке , потому что она не поддерживается в SQL Access. Вместо этого используйте IIf(), как предложил @ Густав.

Однако после этого вы столкнетесь с дополнительными ошибками, поскольку, SUBSTRING и PATINDEX также не поддерживаются в Access SQL.

Вместо CONVERT используйте CInt(), чтобы указать значение для доступа Integer или CLng() для длинного целого. Или вы можете использовать Val() и позволить Access решить, какой цифровой тип данных вам дать.

Вместо SUBSTRING, используйте Mid().

Вместо PATINDEX, используйте InStr().

Предполагая, что эти рекомендации устраняют синтаксические ошибки, у вас может быть проблема с шаблоном Like.

Если вы выполняете запрос от конструктора запросов или где-либо еще в DAO, Access ожидает * вместо % в качестве шаблона. % - это правильная дикая карта, только когда запрос выполняется из ADO/OleDb.