несколько операторов where в большом выборе

У меня есть 2 параметра поиска.

  • Я ничего не могу передать, и тогда я должен получить все строки из БД. ИЛИ я могу передать Param1 и получить строку, где ADB.param1=param1

  • ИЛИ я могу передать Param2 и получить строку, где ADB.param2=param2

  • ИЛИ я могу передать Param1 и Param2 и получить строку, где ADB.param1=param1 and ADB.param2=param2

Давайте представим, что у меня есть БД вроде

CarColor, CarType, CarEngineVolume, CarMakeName param1 is CarColor param2 is CarType, если я выбираю БД без отправки параметров, я должен получить весь список строк

красный,седан,2.0,Honda
синий,седан,3.0,Bmw
зеленый,пикап,4.0,Ford

Если я отправлю только param2, например, "седан", я должен получить следующий список

красный,седан,2.0,Honda

синий,седан,3.0,бмв

но если я отправлю оба параметра, например, param1 «красный» и param2 «седан», я должен получить только 1 строку

красный,седан,2.0,Honda

Если я имею дело только с одним параметром в моем where

WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1))

затем, когда я отправляю param1, я получаю только одну строку и все строки, если param1 имеет значение null и все в порядке

но когда я добавляю вторую проверку параметра

    WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1)) 
AND (BDB.param2 = COALESCE(@param2 , BDB.param2))  )

Я ничего не получаю при отправке только param1. Но я все еще должен получить 1 строку. Но ничего не получить :(


person David    schedule 11.10.2018    source источник
comment
Вы отправляете пустую строку для @param2 или вы отправляете NULL?   -  person Andrew Morton    schedule 11.10.2018
comment
если он равен нулю, я отправляю DBNull при добавлении параметров   -  person David    schedule 11.10.2018


Ответы (2)


используйте OR вместо И

WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1)) 
OR (BDB.param2 = COALESCE(@param2 , BDB.param2))  )
person Zaynul Abadin Tuhin    schedule 11.10.2018
comment
Я могу, но что произойдет, если я отправлю оба параметра? Они не будут считаться оба - person David; 11.10.2018
comment
Если param1 или param2 (любой из обоих) совпадают, он вернет строку - person Anirudha Gupta; 11.10.2018
comment
Да, но я хочу, чтобы строка совпадала с ними обоими. - person David; 11.10.2018
comment
@ Дэвид, было бы хорошо, если бы ты сказал, что ты передаешь как param1 и param2, тогда это будет легко понять - person Fahmi; 11.10.2018
comment
Это параметры поиска. Я ничего не могу передать. ИЛИ я могу передать Param1 ИЛИ я могу передать Param2 ИЛИ я могу передать Param1 и Param2 Для поиска в БД - person David; 11.10.2018

Вы можете использовать это.

WHERE ( ( @param1 IS NULL OR ( ADB.param1 = @param1 )) 
    AND ( @param2 IS NULL OR ( BDB.param2 = @param2 ))
    AND ( ADB.param1 IS NOT NULL OR ADB.param2 IS NOT NULL ) )
person Serkan Arslan    schedule 11.10.2018
comment
System.Data.SqlClient.SqlException: «Неверный синтаксис рядом с ключевым словом «IS». - person David; 11.10.2018
comment
не могли бы вы еще раз проверить скобки в своем запросе? Я проверил это, и этот запрос не дает этого исключения. - person Serkan Arslan; 11.10.2018
comment
Я проверил это через SQL напрямую, и если я отправляю нулевые параметры, я получаю все строки, но только первая строка содержит данные. - person David; 11.10.2018
comment
Если я отправлю нулевые параметры, я получу все строки, но только первая строка содержит данные, разве вы не хотите получить все строки для нулевых параметров? - person Serkan Arslan; 11.10.2018
comment
Я хочу получить все строки с их данными, если я не отправлю параметры. Это означает, что у меня нет конкретных параметров поиска, поэтому я хочу перечислить базу данных whoe как есть. - person David; 11.10.2018
comment
то вы должны проверить имена столбцов в выбранной части. - person Serkan Arslan; 11.10.2018
comment
имена в порядке, потому что, если я отправлю оба параметра, Select работает › ищет соответствующую строку и показывает ее. - person David; 11.10.2018
comment
если у вас есть только param1 и param2 в вашем выборе, он показывает null для null, это нормально. Я не понимаю проблемы? - person Serkan Arslan; 11.10.2018
comment
Я получаю данные из БД. Много рядов. Если я не отправлю параметры поиска, я получу все строки. Если я отправляю только первый параметр поиска, я должен искать все строки, где первый параметр равен параметру поиска. Если я отправлю оба параметра, я должен найти строку, в которой будут оба параметра. - person David; 11.10.2018
comment
вы хотите извлечь нулевые записи из результата? - person Serkan Arslan; 11.10.2018
comment
я сделал обновление - person Serkan Arslan; 11.10.2018