Расширенные заполнители для SQL, например WHERE id IN (??)

Обновление вознаграждения : Уже получил очень хороший ответ от Марка. Адаптировано: = в:, ниже. Однако я все еще ищу подобные схемы помимо DBIx. Я' m просто заинтересован в совместимости с чем угодно .


Мне нужен совет по синтаксису, который я выбрал для "расширенных" заполнителей в параметризованных операторах SQL. Поскольку создание некоторых конструкций (предложений IN) меня беспокоило, я решил использовать несколько сокращений синтаксиса, которые автоматически превращаются в обычные? заполнители.
Они мне нравятся. Но я хочу упаковать его для распространения и спрашиваю себя, легко ли они понятны.

В основном мои новые заполнители - это ?? и :? (перечисленные параметры) и : & и :, и : | и :: (для именованных заполнителей) со следующими вариантами использования:

-> db("  SELECT * FROM all WHERE id IN (??)  ", [$a, $b, $c, $d, $e])

?? заменяется на ?,?,?,?,?, ... в зависимости от количества $ args для моей функции db (). Этот довольно ясный, и его синтаксис уже вроде как стандартизирован. Perls DBIx :: Simple тоже его использует. Так что я почти уверен, что это приемлемая идея.

-> db("  SELECT :? FROM any WHERE id>0   ",  ["title", "frog", "id"]);
// Note: not actually parameterized attr, needs cleanup regex

Признайте это. Смайлик мне просто понравился. Обычно этот заполнитель :? заменяет ассоциативный $ args на простые имена столбцов. Фактически, он отбрасывает любые значения $ args. На самом деле это полезно для INSERT в сочетании с ??, а иногда и для предложений IN. Но здесь я уже задаюсь вопросом, разумен ли этот новый синтаксис или нет, потому что он смешивает: и? персонажи. Но почему-то кажется, что он хорошо соответствует синтаксической схеме.

-> db("  UPDATE some SET :, WHERE :& AND (:|)   ", $row, $keys, $or);

Здесь мнемоника :, расширяется до списка пар name =: name , разделенных , запятые. В то время как : & - это список столбцов =: столбцы, соединенные И s. Для четности добавил : | . У: & есть и другие варианты использования команд UPDATE.
или не просто неправильное название, потому что он смешивает: и? персонажи. Но почему-то кажется, что он хорошо соответствует синтаксической схеме.

-> db("  UPDATE some SET :, WHERE :& AND (:|)   ", $row, $keys, $or);

Здесь мнемоника :, расширяется до списка пар name =: name , разделенных , запятые. В то время как : & - это список столбцов =: столбцы, соединенные И s. Для четности добавил : | . У: & есть и другие варианты использования команд UPDATE.
или не просто неправильное название, потому что он смешивает: и? персонажи. Но почему-то кажется, что он хорошо соответствует синтаксической схеме.

-> db("  UPDATE some SET :, WHERE :& AND (:|)   ", $row, $keys, $or);

Здесь мнемоника :, расширяется до списка пар name =: name , разделенных , запятые. В то время как : & - это список столбцов =: столбцы, соединенные И s. Для четности добавил : | . У: & есть и другие варианты использования команд UPDATE.
Мы добавили : | . У: & есть и другие варианты использования команд UPDATE.
Мы добавили : | . У: & есть и другие варианты использования команд UPDATE.
Но мой вопрос не в полезности, а в том, что:, и: & кажутся запоминаемыми?

 -> db("  SELECT * FROM all WHERE name IN (::)  ", $assoc);

Хотя после некоторых я также добавил :: для интерполяции : named,: value, : list очень похож на ?? расширяется до ?,?,? . Подобные варианты использования, и разумно иметь для единообразия.

В любом случае, реализовал ли кто-нибудь еще такую ​​схему? Различные заполнители? Или что бы вы посоветовали для простоты? Обновление: Я знаю, что интерфейс PHP Oracle OCI также может связывать параметры массива, но не использует для этого специальные заполнители. И я ищу сопоставимые синтаксисы заполнителей.

10
задан mario 27 September 2010 в 14:49
поделиться