0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SELECT文での検索効率を高める方法

Last updated at Posted at 2021-08-23

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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?