ОШИБКА SQL: Msg 102, уровень 15, состояние 1, строка 4 Неверный синтаксис рядом с ',' - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь запустить этот код:

SELECT 
    FIN AS 'LIN',
    CUSIP, 
    Borrower_Name, 
    Alias,
    DS_Maturity, 
    Spread, 
    Facility, 
    Facility_Size, 
    Log_date
FROM 
    [Main].[FacilityInformation]
WHERE 
    CUSIP IN ('00485GAC2', 'N1603LAD9')
    OR (YEAR(DS_Maturity) = (2019, 2024)
    AND ((Borrower_Name LIKE 'Acosta Inc , Bright Bidco BV%'
          OR Alias LIKE 'Acosta 9/14 (18.61) Non-Extended Cov-Lite, Lumileds 2/18 Cov-Lite%')))

Но я получил эту ошибку:

Сообщение 102, Уровень 15, Состояние 1, Строка 4
Неверносинтаксис рядом с ','

Между 2019 и 2024

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

Ответы [ 6 ]

4 голосов
/ 23 октября 2019

Функция YEAR возвращает int, поэтому вам нужно написать

YEAR(DS_Maturity) IN (2019, 2024) 

или как это

YEAR(DS_Maturity) BETWEEN 2019 AND 2024
3 голосов
/ 23 октября 2019

Форматирование SQL с помощью WhiteSpace и разрывов строк значительно облегчает чтение. Если вы сделаете это, вы получите что-то вроде этого:

SELECT FIN AS LIN,
       CUSIP,
       Borrower_Name,
       Alias,
       DS_Maturity,
       Spread,
       Facility,
       Facility_Size,
       Log_date
FROM [Main].[FacilityInformation]
WHERE CUSIP = ('00485GAC2', 'N1603LAD9')
   OR (YEAR(DS_Maturity) = ('2019','2024')
   AND ((Borrower_Name LIKE 'Acosta Inc , Bright Bidco BV%'
      OR Alias LIKE 'Acosta 9/14 (18.61) Non-Extended Cov-Lite, Lumileds 2/18 Cov-Lite%')));

Запустив это, вы получите ошибку:

Сообщение 102, Уровень 15, Состояние 1, Строка 12 Неверный синтаксис рядом с','.

И строка 12:

   OR (YEAR(DS_Maturity) = ('2019','2024')

Вы должны четко видеть, что проблема сейчас (это должно быть IN, а не =).

Лично я рекомендую не использовать YEAR в WHERE, поскольку это делает запрос не SARGable. Вместо этого используйте правильную дату и логическую логику:

   OR ((DS_Maturity >= '20190101' AND DS_Maturity < '20200101')
   OR  ((DS_Maturity >= '20240101' AND DS_Maturity < '20250101')...)
1 голос
/ 23 октября 2019

Хотите использовать функцию BETWEEN Sql?

SELECT FIN AS 'LIN',
       CUSIP,
       Borrower_Name,
       Alias,
       DS_Maturity,
       Spread,
       Facility,
       Facility_Size,
       Log_date
  FROM [Main].[FacilityInformation]
 WHERE CUSIP IN ('00485GAC2', 'N1603LAD9')
    OR (YEAR(DS_Maturity) BETWEEN 2019 AND 2024
        AND ((Borrower_Name LIKE 'Acosta Inc , Bright Bidco BV%'
             OR Alias LIKE 'Acosta 9/14 (18.61) Non-Extended Cov-Lite, Lumileds 2/18 Cov-Lite%')))
1 голос
/ 23 октября 2019

Здесь:

YEAR(DS_Maturity) = ('2019', '2024') 

Это недопустимый синтаксис, вы, вероятно, хотите вместо него использовать оператор IN. Кроме того, YEAR() возвращает число, а не строку

YEAR(DS_Maturity) IN (2019, 2024) 

Вот новая версия вашего запроса. Форматирование и отступ облегчают понимание запроса и обнаруживают проблемы:

SELECT 
    FIN AS [LIN], 
    CUSIP, 
    Borrower_Name, 
    Alias,
    DS_Maturity, 
    Spread, 
    Facility, 
    Facility_Size, 
    Log_date
FROM [Main].[FacilityInformation]
WHERE 
    CUSIP IN ('00485GAC2','N1603LAD9') 
    OR (

        YEAR(DS_Maturity) = (2019, 2024)  
        AND (
            Borrower_Name LIKE 'Acosta Inc , Bright Bidco BV%' 
            OR Alias LIKE 'Acosta 9/14 (18.61) Non-Extended Cov-Lite, Lumileds 2/18 Cov-Lite%'
        )
    )
1 голос
/ 23 октября 2019

У вас есть =, где вы должны иметь in. Но типы тоже не правы. Я бы посоветовал:

SELECT FIN AS 'LIN', CUSIP, Borrower_Name, Alias,
       DS_Maturity, Spread, Facility, Facility_Size, 
       Log_date
FROM [Main].[FacilityInformation]
WHERE CUSIP IN ('00485GAC2', 'N1603LAD9') or 
      (YEAR(DS_Maturity) IN (2019, 2024) AND
       (Borrower_Name LIKE 'Acosta Inc , Bright Bidco BV%' OR
        Alias LIKE 'Acosta 9/14 (18.61) Non-Extended Cov-Lite, Lumileds 2/18 Cov-Lite%'
       )
      )

Если вы хотите, чтобы это был диапазон, вы должны либо включить все значения в диапазон, либо использовать BETWEEN.

0 голосов
/ 23 октября 2019

Замените = на IN, так как у вас есть два значения, то есть больше одного = = 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...