SELECT文に書いたWHERE句は何も工夫をしないと、それが使われない(指定したものがnullの)時も、必然的に指定することになる。結果、容量が重くなったり、検索速度が遅くなってしまう。
たとえば、こんなSELECT文があったとする。
[search_customer.sql]
SELECT
first_name,
last_name,
first_name_kana,
last_name_kana
FROM
customer
WHERE
first_name LIKE '%' || ? || '%',
last_name LIKE '%' || ? || '%',
first_name_kana LIKE '%' || ? || '%',
last_name_kana LIKE '%' || ? || '%';
[list.js (一部省略)]
…
function searchCustomerList(params) {
var customerDb = new TenantDatabase().executeByTemplate(
'unit_test/search_customer', {
first_name :DBparameter.string(params.firstName),
last_name : DBparameter.string(params.lastName),
first_name_kana : DBparameter.string(params.lastName),
last_name_kana : DBparameter.string(params.firstName)
}
);
…
これは、WHERE句で指定したものに合致するデータベースに登録するためのコードであるが、このままでは指定したものがnullの時もわざわざ検索しなければいけなくなる。
それは以下のように書くことで修正することができる。
[search_customer.sql]
SELECT first_name FROM customer
/BEGIN/
WHERE
first_name LIKE '%' || /first_name:string/ || '%'
/END/
/IF last_name != null/
AND last_name LIKE '%' || /last_name:string/ || '%'
/END/
/IF first_name_kana != null/
AND first_name_kana LIKE '%' || /first_name_kana:string/ || '%'
/END/
/IF last_name_kana != null/
AND last_name_kana LIKE '%' || /last_name_kana:string/ || '%'
/END/
/END/
;
[list.js (一部省略)]
…
function createParameterDB(params) {
var firstName = params.firstName == '' ? null : params.firstName;
var lastName = params.lastName == '' ? null : params.lastName;
var firstNameKana = params.firstNameKana == '' ? null: params.firstNameKana;
var lastNameKana = params.lastNameKana == '' ? null : params.lastNameKana;
var dbParams = {
firstName : firstName,
lastName : lastName,
firstNameKana : firstNameKana,
lastNameKana : lastNameKana,
};
return DBparams;
}
function searchCustomerList(params) {
var param = createParameterDB(params);
var customerDb = new TenantDatabase().executeByTemplate(
'unit_test/search_customer', {
first_name : param.firstName,
last_name : param.lastName,
first_name_kana : param.firstNameKana,
last_name_kana : param.lastNameKana,
}
);
…
空文字の時はnullであると指定して、2WaySQLの範囲の有効化を適用することで、SQLの検索効率を高めることができる。
参照
(https://future-architect.github.io/uroborosql-doc/background/#_2waysql%E3%81%A8%E3%81%AF)