web-dev-qa-db-ja.com

複数の列を持つSQLサーバーの 'In'句

提供されたキーに基づいてデータベースからデータを取得するコンポーネントがあります。しかし、私は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サーバーで同じことを達成する方法であるかどうかを知らせてください。

15
Ravi

この構文はSQL Serverには存在しません。 AndOrを組み合わせて使用​​します。

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)

それを行うには、内部結合など、場合によっては他の方法もあります。

10

これを試して、andorを同時に組み合わせることができると思います。

SELECT 
  * 
FROM 
  <table_name> 
WHERE 
  value_type = 1 
  AND (CODE1 = 'COMM' OR CODE1 = 'CORE')
1
JTR

より良い解決策は、値をハードコーディングすることを避け、一時テーブルまたは永続テーブルに配置することです。

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

したがって、コード(永続テーブルバージョン)にデータを格納することを避け、簡単に(コードを変更せずに)フィルターを変更できます。

1
Alexei

通常はできませんが、次のテクニックを使うことができます。

SELECT * FROM <table_name> 
where (value_type+'/'+CODE1) IN (('I'+'/'+'COMM'),('I'+'/'+'CORE'));
1
Roohi Ali

できることは、列を文字列として「結合」し、値も文字列として結合して渡すことです。

where (cast(column1 as text) ||','|| cast(column2 as text)) in (?1)

もう1つの方法は、複数のandsおよびorsを実行することです。

0
Marcel

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')

テーブルのクーポンとキャンペーンのコースの高速検索用のインデックスがあります。

0
gladluter

IN Clause

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');
0
Ullas