提供されたキーに基づいてデータベースからデータを取得するコンポーネントがあります。しかし、私はJavaアプリケーションで、1つのデータベースヒットのすべてのキーのすべてのデータを取得して、処理を高速化したいと考えています。キーが1つしかない場合は、「in」句を使用できます。
複数のキーに取り組んでいる間、Oracleで以下のクエリを使用できます
SELECT * FROM <table_name>
where (value_type,CODE1) IN (('I','COMM'),('I','CORE'));
書くのと同じです
SELECT * FROM <table_name>
where value_type = 1 and CODE1 = 'COMM'
そして
SELECT * FROM <table_name>
where value_type = 1 and CODE1 = 'CORE'
一緒
ただし、上記の「in」句を使用するこの概念は、「SQLサーバー」で以下のエラーを発生させます。
ERROR:An expression of non-boolean type specified in a context where a condition is expected, near ','.
それらがSQLサーバーで同じことを達成する方法であるかどうかを知らせてください。
この構文はSQL Serverには存在しません。 And
とOr
を組み合わせて使用します。
SELECT *
FROM <table_name>
WHERE
(value_type = 1 and CODE1 = 'COMM')
OR (value_type = 1 and CODE1 = 'CORE')
(この場合、value_typeは両方の組み合わせで同じ値と比較されるため、短くすることができます。私は、複数のフィールドを持つOracleでINのように機能するパターンを示したかっただけです。)
INをサブクエリで使用する場合は、次のように言い換える必要があります。
Oracle:
SELECT *
FROM foo
WHERE
(value_type, CODE1) IN (
SELECT type, code
FROM bar
WHERE <some conditions>)
SQLサーバー:
SELECT *
FROM foo
WHERE
EXISTS (
SELECT *
FROM bar
WHERE <some conditions>
AND foo.type_code = bar.type
AND foo.CODE1 = bar.code)
それを行うには、内部結合など、場合によっては他の方法もあります。
これを試して、and
とor
を同時に組み合わせることができると思います。
SELECT
*
FROM
<table_name>
WHERE
value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE')
より良い解決策は、値をハードコーディングすることを避け、一時テーブルまたは永続テーブルに配置することです。
CREATE TABLE #t (ValueType VARCHAR(16), Code VARCHAR(16))
INSERT INTO #t VALUES ('I','COMM'),('I','CORE')
SELECT DT. *
FROM <table_name> DT
JOIN #t T ON T.ValueType = DT.ValueType AND T.Code = DT.Code
したがって、コード(永続テーブルバージョン)にデータを格納することを避け、簡単に(コードを変更せずに)フィルターを変更できます。
通常はできませんが、次のテクニックを使うことができます。
SELECT * FROM <table_name>
where (value_type+'/'+CODE1) IN (('I'+'/'+'COMM'),('I'+'/'+'CORE'));
できることは、列を文字列として「結合」し、値も文字列として結合して渡すことです。
where (cast(column1 as text) ||','|| cast(column2 as text)) in (?1)
もう1つの方法は、複数のandsおよびorsを実行することです。
MS SQLでも同様の問題がありましたが、少し異なりました。多分それは将来の誰かを助けるでしょう、私の場合、私はこの解決策を見つけました(完全なコードではなく、単なる例):
SELECT Table1.Campaign
,Table1.Coupon
FROM [CRM].[dbo].[Coupons] AS Table1
INNER JOIN [CRM].[dbo].[Coupons] AS Table2 ON Table1.Campaign = Table2.Campaign AND Table1.Coupon = Table2.Coupon
WHERE Table1.Coupon IN ('0000000001', '0000000002') AND Table2.Campaign IN ('XXX000000001', 'XYX000000001')
テーブルのクーポンとキャンペーンのコースの高速検索用のインデックスがあります。
Query
SELECT * FROM [table_name]
WHERE value_type IN (1)
AND CODE1 IN ('COMM', 'CORE');
[〜#〜]または[〜#〜]
SELECT * FROM [Table_Name]
WHERE value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE');