Использование CASE в инструкции SELECT WHERE

Я впервые работаю над приложением VB, используя базу данных SQL, У меня есть столбец Removing_Date в одной из моих таблиц со смешанными входными данными (текст и даты). например (Никогда, Решение будет принято позже или точные даты, например (21.08.2024)) Я пытаюсь отфильтровать его по диапазону дат, если это дата, или по тексту, если это текст.

так вот мой код

If CHK_RemovingDate.Checked = True Then

    If CHK_RemovingDateText.Checked = False Then
    
      Sql_Command = "Select * From Main Where CASE IsDate([RemovingDate]) When True Then [RemovingDate] Between '" & RemovingDate1.Value & "' And '" & RemovingDate2.Value & "' End Case"
    
    ElseIf CHK_RemovingDateText.Checked = True Then
    
      Sql_Command = "Select * From Main Where [RemovingDate] LIKE '%" & TXT_RemovingDate_Text.Text & "%'"
    
    End If
    
End If

что такое база данных на сервере?

Ahmad 28.07.2024 13:29

это база данных Sql Server

Husam Nurein 28.07.2024 13:32

Это действительно неприятное дизайнерское решение. В столбце не должно быть смешанных типов. Никогда. Оставьте столбец как Тип даты, добавьте битовые столбцы для каждого случая. И как можно быстрее узнайте, что такое и как предотвратить Sql Injection

Steve 28.07.2024 13:35

у вас недостижимый код из-за используемой вами логики IF. Первый IF позволяет коду выполняться только в том случае, если флажок установлен, но следующая строка никогда не будет истинной. рассмотрите возможность перезаписи блока if/else

Ahmad 28.07.2024 13:35

это два разных флажка (CHK_RemovingDate) и (CHK_RemovingDateText)

Husam Nurein 28.07.2024 13:49

Не создавайте SQL с конкатенацией строк: это уязвимо для SQL-инъекций! Всегда параметризуйте свои запросы.

Richard 28.07.2024 13:57

Не используйте SELECT * в реальном коде: запишите имена столбцов в том порядке, в котором вы хотите, чтобы они возвращались. В противном случае столбцы могут быть возвращены в любом порядке.

Andrew Morton 28.07.2024 14:56

ElseIf на самом деле может быть просто Else, потому что он либо отмечен, либо нет. Кроме того, было бы проще понять, изменив условное выражение: If CHK_RemovingDateText.Checked Then ... Else ... End If. И = True или = False не нужны. Checked уже является логическим значением.

Olivier Jacot-Descombes 28.07.2024 16:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
8
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несмотря на все полезные советы, представленные в комментариях, один правильный синтаксис для предложения WHERE (для вашего первого запроса):

WHERE TRY_CAST([RemovingDate] as DATE) BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd'

TRY_CAST пытается преобразовать текст в RemovingDate в дату. Результат зависит от формата даты в текстовой форме и региональных настроек хоста SQLServer. Он возвращает NULL, если текст не может быть преобразован в действительную дату (и NULL BETWEEN... возвращает false). Было бы лучше, если бы дата в текстовой форме соответствовала формату гггг-мм-дд (порядок компонентов даты ISO). Если нет, но формат соответствует, вы можете использовать TRY_CONVERT с правильным параметром стиля. Если у вас есть дата в специальной форме

...не забывая, что BETWEEN включает первый параметр и исключает второй параметр, но somedate >= firstdate AND somedate <= lastdate часто является тем, что подразумевается.

Andrew Morton 29.07.2024 20:03

Спасибо @tinazmu. Я использовал TRY_CONVERT следующим образом, и это сработало Select * From Main Where TRY_Convert(Date,[RemovingDate],103) Between '" & RemovingDate1.Value & "' And '" & RemovingDate2.Value & "'

Husam Nurein 30.07.2024 14:44

Другие вопросы по теме