SQL Использовать больше/меньше чем с подобными и подстановочными знаками

В настоящее время я немного озадачен тем, как реализовать определенную вещь. По сути, у меня есть встроенная база данных (которая действительно ненавидит JOIN с точки зрения производительности) и требование добавления механизма подстановочных знаков в поле поиска. В настоящее время поле поиска позволяет пользователю вводить дату и некоторые суммы/доходы, которые сопоставляются с помощью чего-то вроде: SELECT * FROM table where date >= '{0}' AND date <= '{1}'

РЕДАКТИРОВАТЬ: Это связано с тем, что адаптер .NET генерирует SQL во время выполнения с возможными различными комбинациями предложений AND. Может быть, пользователь вводит только значение для {0}, может быть, он вводит только одно для {1}, может быть, он вводит оба значения, а может быть, он не вводит ни одного. Поэтому BETWEEN, к сожалению, потерпит неудачу, если я не начну серьезное регулярное выражение.

Я хотел бы использовать ключевое слово LIKE для реализации чего-то вроде:

SELECT * FROM table where date >= LIKE '{0}' AND date <= LIKE '{1}' с {0} чем-то вроде "2015.01*"

Я понимаю, что Date может быть слишком много, но возможно ли использование таких вещей, как суммы или доходы? Если да, то каков правильный синтаксис? Гугл в этом мне не друг...

Заранее спасибо за вашу помощь!


person fk2    schedule 11.06.2015    source источник
comment
Почему вы не используете пункт between? select * from something where abc between 0 and 5.   -  person Amnesh Goel    schedule 11.06.2015
comment
См. «Редактировать», почему это сложно сделать? И как будет выглядеть этот запрос? SELECT * FROM table WHERE date BETWEEN LIKE {0} AND LIKE {1} ?   -  person fk2    schedule 11.06.2015
comment
Что ж, если вы пишете свой запрос во время выполнения в .NET, у вас есть все варианты. Поскольку вы знаете, что у вас может быть один или два параметра для сравнения, лучшим случаем для одиночного сравнения является =, когда вы уверены в значении, используйте LIKE, когда хотите выполнить шаблон сопоставления, и используйте BETWEEN, когда у вас есть два значения. как between 10 and 50.   -  person Amnesh Goel    schedule 11.06.2015
comment
Выбирайте варианты с умом, потому что у каждого пути есть свои плюсы и минусы. Не используйте LIKE, если у вас нет шаблона для сопоставления. Если вы получаете прямое значение, используйте =. Не забывайте, что вы можете свободно использовать другие операторы сравнения, такие как >=, <= и != и т. д.   -  person Amnesh Goel    schedule 11.06.2015
comment
Верно, но как будет выглядеть запрос, если я хочу одновременно выполнять и сравнение значений, и сопоставление с образцом? Или это просто невозможно?   -  person fk2    schedule 11.06.2015
comment
Это возможно. Я уверен, что во время построения запроса вы должны знать, какой тип запроса вы хотите создать. Так что подготовьте логику в .NET соответствующим образом. Возможно If {1} = string.empty then select * from abc where a = {0} or a like '{0}%' else select * from abc where a between {0} and {1} или больше вариантов.. дайте мне знать, что вы строите   -  person Amnesh Goel    schedule 11.06.2015


Ответы (1)


LIKE выполняет сопоставление с регулярным выражением, поэтому, например, LIKE '%a' соответствует '1a', но также и '2a'. Отсюда совершенно ясно, что >= LIKE '...' невозможен.

Что вы можете сделать, так это построить строку из даты, чтобы у вас было, например, «ГГГГММДД», тогда вы могли бы легко сравнить с LIKE 'YYYYMM%' или с >= 'YYYYMM'.

Тем не менее я не понимаю, почему вы просто не используете SELECT * FROM table where date >= '{0}' AND date <= '{1}' (или вариант этого запроса с использованием between), который вы уже предложили.

person Werner Henze    schedule 11.06.2015
comment
Значение в {0} должно соответствовать регулярному выражению, то есть пользователь должен иметь возможность ввести 1234% или 1234* (с некоторой заменой строки), и запрос, который я динамически создаю, должен действительно искать это соответствие. - person fk2; 11.06.2015
comment
@fk2 Если вы действительно хотите сопоставление регулярных выражений, используйте подход, который я сказал (столбец в формате ГГГГММДД, НРАВИТСЯ ...). Если бы вы могли сузить ввод пользователя, чтобы он всегда был ГГГГ* или ГГГГММ*, вы могли бы рассчитать минимальную/максимальную дату для сравнения ‹= и ›=. Это будет работать намного лучше. - person Werner Henze; 11.06.2015
comment
Да, это, вероятно, сработает для свидания. Я надеялся на более легкий путь, но, думаю, я стисну пулю. Как бы это работало, если бы у меня был неформатированный ввод, такой как сумма, которая может быть любой длины? - person fk2; 11.06.2015
comment
@ fk2 Что именно вы имеете в виду? Количество столбцов типа int и сравнение со строкой '123*'? Было бы довольно просто: просто отформатируйте int как строку, чем вы можете НРАВИТСЯ. Но имеет ли смысл сравнивать число с «123*», соответствующим 123, 1234, 1235, 123000000, ...? - person Werner Henze; 11.06.2015
comment
Я думал о чем-то вроде SELECT * FROM data WHERE amount <= '1234%' AND amount >= '12_4' с % и _, которые ведут себя так же, как при использовании ключевого слова like. - person fk2; 12.06.2015
comment
@fk2 Какие числа вы ожидаете, чтобы соответствовать вашему запросу? - person Werner Henze; 12.06.2015
comment
Например, 1224 будет равно 12_4, но меньше, чем любая вариация 1234%, поэтому должны возвращаться данные с количеством 1224. 1244 ничего не вернет из-за первого пункта. Таким образом, любые числа меньше 1234% и их перестановки больше, чем любая перестановка 12_4. - person fk2; 12.06.2015
comment
@ fk2 И каков будет практический вариант использования этого? - person Werner Henze; 12.06.2015
comment
Абсолютно никого нет, и я лоббировал против этого, но я не отвечаю за спецификации (пока) - person fk2; 12.06.2015