2015-01-05 4 views
1

У меня есть таблица с 42 полями. Однако большинство из них примерно одинаковы. У меня есть 20 полей с именем a01 до a20 и еще 20, которые называются b01 - b20. Остальные 2 - это ПК и ФК.Есть ли способ сократить запрос с большим количеством полей?

Есть ли способ сократить запрос INSERT? Прямо сейчас, из-за ПК, я должен указать, какие столбцы Я использую, например:

INSERT INTO Table01 (col_FK, a01, b01, a02, b02.....(etc) 

Однако реальная проблема я имею мой SELECT запрос. Мой запрос в основном позволяет пользователю искать одно или несколько полей и иметь NULL в качестве сравнения, если поле остается пустым.

SELECT * FROM Table01 WHERE 
    (@col_FK IS NULL OR col_FK LIKE @col_FK) 
    AND (@a01 IS NULL OR a01 LIKE @a01) 
    AND (@b01 IS NULL OR b01 LIKE @b01) 
    etc... 

Так, например, если я только вошел кое-что, чтобы a01 и оставил остальное пусто, то запрос будет выглядеть следующим образом:

SELECT * FROM Table01 WHERE 
    (NULL IS NULL OR col_FK LIKE NULL) 
    AND ('text' IS NULL OR a01 LIKE 'text') 
    AND (NULL IS NULL OR b01 LIKE NULL) 
    etc... 

Я действительно не хотят должны делать это для всех 40 полей, так ли я мог бы сделать это короче?

Примечание: факторинга выше (@a01, @b01) делается в C#, так что я могу передать параметры в запросе.

+0

Как вы узнаете, какое поле пользователь хочет найти? Или это всего лишь запрос типа «тип что-то и посмотреть, появляется ли он в любом из полей»? –

+0

@ Я думаю, что происходит, если я ищу столбец 'a01', остальная часть запроса будет сравниваться с' NULL'.Например, это будет что-то вроде: 'SELECT * FROM Table01 WHERE (NULL NULL ИЛИ col_FK LIKE NULL) AND ('text' IS NULL ИЛИ a01 LIKE 'text') и т. Д.' – Ben

+1

Да, я понимаю, но мой вопрос в том, как вы заполняете или передаете '@ a01'? У вас есть 40 текстовых полей/входов? Я пытаюсь понять, что если запрос выполняется с C#, вы можете динамически создать строку запроса только с значениями, которые вы хотите сравнить, но мне нужно знать, откуда берутся значения, чтобы увидеть если это возможно. –

ответ

0

Я бы указал столбцы в инструкции INSERT. Это дает вам больше шансов, что ваш оператор будет «работать», если новые столбцы будут добавлены в таблицу. И ваш оператор не будет выполняться, если (ack!) Столбцы в таблице будут переупорядочены.

Что касается выражения SELECT короче ... это вопрос наличия одного статического SQL-оператора, а также нескольких вариантов выражения SQL. Для баз данных, отличных от MySQL (например, Oracle или SQL Server, мои личные предпочтения - использовать один статический оператор SQL с привязками привязки. Затем у меня есть только один SQL-запрос, который нужно настроить, он остается в пуле и используется повторно, не дюжина или более разных вариантов.

Я выбираю динамический SQL, когда у меня есть col IN (?,?,?) с переменным количеством значений в списке. Тогда это вопрос того, сколько связующих заполнителей и сколько соответствующих связующих Параметры:

Я бы также выбрал динамический SQL (несколько вариантов), когда у меня появятся лучшие планы запросов, то есть он получит лучшее время выполнения с меньшим количеством ресурсов. Это будет просто вопрос некоторого кода для добавления AND a17 LIKE CONCAT('%',?,'%') в текст SQL, и соответствуют код для привязки. Опять же, я бы только потрудился с этим, если бы он дал мне повышение производительности.

Я бы не «сократил» любые предложения SQL только ради «более коротких» операторов SQL. Для меня это не имеет смысла, потому что я предпочел бы оседлать меньшее стадо высказываний, даже если некоторые из этих заявлений огромны. (Что касается управления ведром операторов, то один большой оператор на самом деле проще управлять, чем лоток небольших операторов, которые все похожи друг на друга.

+0

Я рассматривал ответ, который я дал; возможно, я действительно не ответил на вопрос, о котором спрашивал OP ... есть ли способ сделать статический оператор SQL короче, то есть заставить оператор делать то же самое *, но это не требует, чтобы каждый отдельный столбец был ссылка или каждое значение привязки, которое предоставляется дважды. Я действительно не дал ответа на этот вопрос («** нет, это невозможно, на каждый столбец нужно ссылаться **»). Остальная часть моего ответа предполагает ответ. – spencer7593

Смежные вопросы