COALESCE вместе с FTS - PullRequest
       16

COALESCE вместе с FTS

1 голос
/ 09 апреля 2011

У меня есть форма, в которой есть выпадающий список «бренд» и «модель». Я ищу здесь автомобили, которые имеют какую-то марку и / или модель. Теперь, если я выберу «all» из выпадающего списка «brand» и какое-то значение «model», отличное от «all», я использую

COALESCE (@ бренд, cars.brand)

и

COALESCE (@ модель, cars.model)

, он работает нормально, как при возврате всех автомобилей, если я выберу «все» как для выпадающих меню, так и для конкретных результатов, если я выберу какое-то значение. Теперь я хочу использовать FTS с ключевым словом CONTAINS и запросом типа

CONTAINS(cars.model , 'COALESCE(@model,cars.model)')

возвращается с ошибкой как

Синтаксическая ошибка рядом с '(' в условии полнотекстового поиска 'COALESCE (@ model, cars.model)'.

Я был бы очень признателен, если бы кто-нибудь смог направить меня к запросу / запросу, который является FTS вместе с COALESCE. Пожалуйста, помогите. P.S

SET @SQL = '
SET @query_result = ( 
    SELECT items.id AS "ID"
            ,items.title AS "Title"
            ,cars.brand AS "Brand"
            ,cars.model AS "Model"
            ,cars.type AS "Type"
            ,items.city AS "City"
            ,items.name AS "Name"
            ,items.date_added AS "Date"
            ,items.small_1 AS "Image"
      FROM [cars]
      JOIN [items] 
        ON items.id=cars.item_id
     WHERE cars.item_id = COALESCE(@item_id,cars.item_id)
            AND CONTAINS(cars.brand ,''COALESCE('+@brand+',cars.brand)'')
            AND cars.model = COALESCE(@model,cars.model)
            AND cars.type = COALESCE(@type,cars.type)
            AND items.city = COALESCE(@city,items.city)
            AND DATEDIFF(DAY,items.date_added,GETDATE())<=COALESCE(@period,items.date_added)
            AND items.new = COALESCE(@isnew,items.new)
       FOR XML
      PATH(''car''),ROOT(''items''))'

1 Ответ

0 голосов
/ 21 сентября 2013

eЭто шаблон, который я никогда раньше не видел, поэтому простите меня, если я не понимаю.

Я почти уверен, что проблема в этой строке.

AND CONTAINS(cars.brand ,''COALESCE('+@brand+',cars.brand)'')

Проблема в том, что он сгенерирует предложение:

AND CONTAINS(cars.brand, 'COALESCE(toyota,cars.brand)')

Я не думаю, что это именно синтаксическая ошибка, но это объединенное выражение в этой точке является литеральной строкой, и оценка не произойдет. У вас также будет проблема, если brand null, потому что вы добавите NULL в первую и последнюю часть кода SQL.

Вы можете попробовать просто:

AND CONTAINS(cars.brand, coalesce(@brand, cars.brand))

без побега. Если по какой-то причине это не работает, попробуйте:

' + CASE WHEN @brand is null then '' else 'AND CONTAINS(cars.brand, @brand)' end + '

Это вставит предложение, только если @brand не имеет нулевого значения и не подвержено уязвимости SQL-инъекций, как если бы вы вручную экранировали кавычки.

...