Оператор SQL Match Anything - PullRequest
       6

Оператор SQL Match Anything

0 голосов
/ 02 октября 2009

Я использую регулярное выражение в своих инструкциях SQL для приложения, которое выглядит следующим образом

SELECT * ИЗ таблицы WHERE id = {{REPLACEME}}

Однакоиногда я не даю параметр для замены этой строки.Есть ли способ заменить его чем-то, что соответствует чему-либо.Я пытался *, но это не работает.

Ответы [ 6 ]

7 голосов
/ 02 октября 2009
  1. SELECT * FROM table WHERE id = id будет соответствовать всем строкам с ненулевым значением id
  2. SELECT * FROM table WHERE id = id OR id IS NULL будет соответствовать всем строкам.

id, вероятно, является первичным ключом, поэтому вы, вероятно, можете использовать первый.

2 голосов
/ 02 октября 2009

Заменить {{REPLACEME}} на

[someValidValueForYouIdType] OR 1=1
2 голосов
/ 02 октября 2009

Я могу описать свое решение только на примере. @AllRec - это параметр:

Declare @AllRec bit
set @AllRec = {0|1}  --as appropriate

SELECT * 
FROM table 
WHERE 
   (
       id = {{REPLACEME}}
       and @AllRec = 0
   ) OR (
       @AllRec = 1
   )

В этом решении, если @AllRec равно 1, все возвращается, игнорируя фильтр id. Если @AllRec равно нулю, тогда применяется фильтр id, и вы получите одну строку. Вы должны быть в состоянии быстро адаптировать это к вашему текущему решению регулярных выражений.

1 голос
/ 02 октября 2009
SELECT field1, field2
FROM dbo.yourTable
WHERE id = isnull(@var, id)
1 голос
/ 02 октября 2009

Использование опции Regex-Replace открывает для вас атаки SQL-инъекций.

Предполагая, что ваш язык поддерживает параметризованные запросы, попробуйте эту модифицированную версию ответа Джейкоба:

SELECT * FROM table WHERE (id = @id OR @id IS NULL)

Проблема в том, что вам всегда нужно указывать значение @id.

0 голосов
/ 02 октября 2009

Не знаю, какой язык вы используете, и этот код меня пугает, но ...


var statement = "SELECT * FROM table";

If REPLACEME is not empty Then
   statement += " WHERE id = {{REPLACEME}}"
End If


...