select *
, checker = case
when charindex('SURPLUS CASH',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0
or charindex('CHQ IN AT',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0
or charindex('ELECTR CHARGE',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0
then 'Exclude'
else ''
end
from t
結果:http://rextester.com/VBOC27547
+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+
| statement_no | bank_text_1 | bank_text_2 | bank_text_3 | bank_text_4 | bank_text_5 | amount | checker |
+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+
| 0001 | SURPLUS CASH | | | | | 125,00 | Exclude |
| 0002 | M THOMAS | TRAINING FEE | CHQ IN AT 100217 | | | 470,00 | Exclude |
| 0003 | SWALEC | Training Centre One | Abergaveny | | Electr Charges | 700,00 | Exclude |
| 0004 | M Thomas | Training Centre Hire | | | | 850,00 | |
+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+
私は1,000,000行を超えるジョン・カペレッティの回答と比較して、こののパフォーマンスをテストし、私は彼らが同等であると言うでしょう。
私の個人的な好みは、cross apply()
を使用してジョンの答えでしょう。
以下のセットでは、各セットの最初のクエリはcharindex(...,concat(..)
を使用し、2番目のクエリはJohnのcross apply()
バージョンを使用します。
このインスタンスのハードウェア仕様はかなり弱いですが、マイレージは変わります。
-----------------------
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3010 ms, elapsed time = 8750 ms.
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 5585 ms, elapsed time = 8725 ms.
-----------------------
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3307 ms, elapsed time = 8685 ms.
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 5663 ms, elapsed time = 8913 ms.
-----------------------
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3073 ms, elapsed time = 8414 ms.
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 5647 ms, elapsed time = 9049 ms.
-------------------
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3011 ms, elapsed time = 8706 ms.
(1000000 row(s) affected)
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 5491 ms, elapsed time = 8704 ms.
-----------------------
JDBC(Java)やADO.NET(.NET)などの何らかのデータアクセスを使用している場合は、パラメータを使用できます。パラメータを使用すると、クエリはもはや乱雑になりません。私はあなたがすでに持っている方法を好むのは、維持しやすいからです。 – Loc