2015-08-17 3 views
-2

Когда я исполняю ниже запроса в SQL сервере я получил ниже ошибкиMSSQL ошибка синтаксиса около ключевого слова «в»

Неправильный синтаксис около ключевого слова «в»

Запрос:

select projectid 
from projects 
where iif(1!=1, 
projects.projectid in (1,16,17,18,19,20,21,22,23), 
1); 
+3

Пожалуйста, отметьте свой вопрос правильно. 'iif()' не является функцией MySQL, а не типичной функцией SQL Server (вы должны использовать 'case' в SQL Server,' iif() 'обеспечивает совместимость для MS Access). Кроме того, ваша логика имеет мало смысла, потому что «1 <> 1» всегда ложно. –

+0

Извините, моя ошибка: mssql – HUM

+0

здесь я получил описание ссылки iif(): https://msdn.microsoft.com/en-IN/library/hh213574.aspx – HUM

ответ

1

Это будет работать.

Объяснение: вы не можете использовать оператор IN в THEN-части инструкции CASE, поэтому используйте вложенные операторы CASE. Теперь этот запрос не даст вам никакой записи, потому что «1! = 1» всегда возвращает false, а часть THEN не будет выполняться.

SELECT projectid 

FROM projects 

WHERE 
projectid = CASE 

     WHEN 1 != 1 

     THEN 

      CASE 
      WHEN projectid IN (1,16,17,18,19,20,21,22,23) 
      THEN projectid 
      ELSE 1 END 
     END; 

Теперь нет синтаксической ошибки возле ключевого слова IN. Вы можете изменить этот запрос в соответствии с вашим требованием.

+0

да, это работа, спасибо @Muhammad – HUM

+0

Мое удовольствие @HUM –

+0

То же, что: 'WHERE 1!= 1 И projectid IN (1, 16, 17, 18, 19, 20, 21, 22, 23) ИЛИ 1 = 1 И projectid = 1' – shawnt00

0

Это должно быть так же просто, как:

select projectid 
from projects 
where projects.projectid in (1,16,17,18,19,20,21,22,23) 

Не вижу смысла помещать функцию IIF в предложение where.

iif(1!=1, projects.projectid in (1,16,17,18,19,20,21,22,23), 1) 

В простом английском языке в строке выше, как взаимодействует if 1 is not equal to 1 then use the IN expression else return 1

1 всегда равен 1, а остальное не имеет никакого смысла.

+0

Это только пример, но я хочу использовать sub query in where where и здесь 1! = 1 условие изменится, это не исправление. это может быть как iif (company_id! = 1), поэтому здесь, если выражение истинно, чем предложение IN должно выполняться, но SQL дает ошибку, например, неправильный синтаксис рядом с «IN»? – HUM

+0

Хорошо даже в этом случае использование оператора 'IIF' недопустимо в where where, IIF вернет первое значение, если выражение будет оценено как true или 2nd, если false, в любом случае IIF вернет значение в предложении WHERE вам нужно выражение, которое будет оцениваться для каждой строки, возвращаемой запросом, IIF вернет только одно значение, а не выражение, поэтому сервер sql не знает, что с ним делать, и ошибок. –

+0

Вы можете использовать IIF в where где-то вроде 'WHERE 1 = IIF (, 1, 0)' –

1

Эквивалент логика:

select p.projectid 
from projects p 
where (1 = 1) or p.projectid in (1, 16, 17, 18, 19, 20, 21, 22, 23); 

Однако это излишество, потому что первое выражение включает только константу и всегда верно. Чаще всего, вы бы что-то вроде:

where (@TakeAllFlag = 1) or p.projectid in (1, 16, 17, 18, 19, 20, 21, 22, 23); 

Кроме того, если вы изучаете SQL - а не с помощью MS Access - узнать CASE заявление, не IIF(). CASE является стандартным SQL и доступен в основном во всех базах данных.

Смежные вопросы