2012-07-24 15 views
11
+------------------+ 
| id1 | id2 | bool | 
+------------------+ 
| 1 | 1 | F | 
| 1 | 2 | F | 
| 2 | 1 | F | 
+------------------+ 

UPDATE table_name 
SET bool = T 
WHERE (id1, id2) IN ((1,1),(2,1)) --Need work here 

基本的に(id1、id2)=(value1、value2)の条件を選択したいと思います。 SQLの更新データのセット

WHERE id1 = value1 AND id2 = value2 

ただし、配列の値の集合に似ています。 これは可能ですか?事前に

おかげ

編集:私はSQL Server 2008を使用しています、それはあまりにも明確ではなかった場合はごめんなさい。 私はこれをストアドプロシージャとして配置し、サービスから呼び出しようとしています。入力はある種の配列(可変サイズ)であり、行内の2つのIDとの一致を見つけます。

+3

どのデータベースをお使いですか? –

答えて

2

ここでは、MSSQLでそれを行う方法です。必要なのは、Id1とId2から1つの値(この例ではVARCHAR)を作成するだけです。この場合、IN文に値を設定して使用できます。また、これらのフィールドで許可されている場合は、id1とid2のNULLを考慮する必要があります(単に、and id1 is not null and id2 is not nullを追加してください)。

UPDATE table_name 
SET bool = T 
WHERE convert(varchar(20),id1)+','+convert(varchar(20),id2) in ('1,1','2,1') 
+0

ありがとうございました。これはまさにそれです。しかし、varcharを比較すると実際には良いのではなく、パフォーマンスが賢明なのでしょうか? –

+0

実際には、任意のタイプの検索値を作成できます。たとえば、テーブルのid1、id2を常に<1000とすると、このWHEREステートメントをWHERE id1 * 1000 + id2 in(1001,2001)に置き換えることができます。この場合、文字列に変換することさえできません。 – valex

0

あなたは、SQL Serverを使用している場合は、Oracleに

 UPDATE table_name 
    SET bool = T 
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2) 

を使用している場合、我々は一つの値が一致することをより多くのを持っている場合、通常、私たちは句で使用し、これを試してください。この

 UPDATE table_name 
    SET bool = T 
    WHERE (convert(varchar 20, id1) + '-' + convert(varchar 20 , id2)) 
     IN (convert(varchar 20 , value1) + '-' + convert(varchar 20 , value2), 
     convert(varchar 20 , value3) + '-' + convert(varchar 20 , value4)); 

を試してみてください。これを達成するために、あなた(ID1 = value1とID2 =値2)と(ID1 =値3とID2 = value4)

 UPDATE table_name 
    SET bool = T 
    WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4) 
+0

ありがとうございます。私はSQLサーバーでこれを試してみましたが、うまく実行されました。しかし、結果は私が探していたものではありませんでした。面白い結果が得られました。条件文が何をしているのか分かりません。説明してもらえますか、おそらく他のものにも当てはまりますか?ありがとうございます –

+0

私はオラクルを使用しているため、私のコードはoracleにもっと適していました。私はSQLサーバーを使って再度説明するために私の答えを編集します – user1512999

0

ひとつのアイデアを想定し は

Create Table #Temp 
(
    id1 int, 
    id2 int 
) 
insert into #Temp values(1,1) 
insert into #Temp values(1,2) 
insert into #Temp values(2,1) 
insert into #Temp values(2,2) 

--update data 
UPDATE 
table_name 
SET bool = T 
from table_name T1 
inner join #Temp T2 
on T1.Id1= T2.Id1 
and T1.Id2= T2.Id2 
0

はこれを試してみてください一時テーブルを使用することです - SQL Server 2008バージョン。

create table mytable 
(
id1 int, 
id2 int, 
bool char(1) 
); 

insert INTO mytable VALUES(1,1,'F'); 
insert INTO mytable VALUES(1,2,'F'); 
insert INTO mytable VALUES(2,1,'F'); 

SELECT * FROM mytable; 

update mytable 
set bool='T' 
WHERE exists (SELECT id1,id2 from mytable tb2 
where mytable.id1 = 1 AND mytable.id2 = 1 
or mytable.id1 = 2 AND mytable.id2 = 1); 

SELECT * from mytable; 
0

このクエリでは、Oracleで動作します...あなたのデータベースです

UPDATE table_name 
SET BOOL = T 
WHERE (id1, id2) IN (SELECT 1,1 FROM DUAL UNION SELECT 2,1 FROM DUAL); 

+0

私はその細部を入れなかったのです。私はSQL Server 2008を使用しています –

+0

whereの条件の入力データ型はどれですか?私はArrayがSQLサーバー2008に存在しないと思います。 – TechDo

0

あなたは基本的に何をしようとしていますか?これはあなたがそれをすることを選んだ理由です。あなたは、セットベースのロジックを理解するのに少しばかばかしいようです。他のポスターから提供されている回答はそれぞれ有効で有効ですが、あなたの目的に最も適した回答ではないかもしれません。この処理は既存のデータセットに対して行われますか?それはデータロードまたは挿入プロセスの一部ですか?リストされた各IDフィールドには、固有の値域があります。あなたの例に基づいて、あなたが本当にがやりたいと思っているものを、更新がブール値であると表示されたら、ID2 = 1

UPDATE table_name SET Bool = 'T' 
WHERE Id2 = 1 

あなたには、いくつかのデータに基づいてブール値を設定し、ロジックを開発するために欠けているより多くの可能性ルール - 例えば、Id2がId1よりも小さいか等しい場合。 case文はここに動作します:あなたが挿入した値のそれぞれとすべてのバリエーションのためのあなたのWHERE句での書き込みAND/ORルールよりも、大規模データを扱う際に

UPDATE table_name SET Bool = CASE WHEN Id1 > Id2 THEN 'T' ELSE 'F' END 

これは、はるかに効率的です。

ロジックを入力/入力して実装する場所ではなく、フィルタとしてWHEREを考えてください。

小さなデータの挿入(テーブルフィールドに手動で値を入力するか、トランザクションによって何らかの種類のWebフォームのトランザクションから挿入する)場合は、手動で値を手動で設定するか、システムの手続き部分を確認し、テーブルに検証規則を適用します。

これを行うストアドプロシージャを作成する場合は、ID値の変数を作成し、外部システム情報をデータベースシステムに送信するすべてのシステムにリンクします。 (私はあなたがすでにテーブル構造を作成していると仮定します);

CREATE PROCEDURE table_name_insert 
@Id1 Int NOT NULL, 
@Id2 Int NOT NULL 

-- If you want to execute the logic outside of the DB environment 
-- (perhaps as part of an SSIS package) then you will want to add this 
-- variable and pass it in explicitly. 

, @Bool bit NOT NULL 


AS 

DECLARE @sql nvarchar(4000) 


SET @sql = ' 
INSERT INTO table_name (ID1, ID2, Bool) 
SELECT @Id1, @Id2, [Case Logic or Variable Value for Bool] 
' EXEC sp_executeSQL @sql 

このプロセスはプログラムによって呼び出され、配列から生成する可能性のある変数を渡します。また、値を適切な列に直接インポートしてから、挿入後のコードでBoolロジックを実行する方法もあります。すべてのケースを処理するWHEREステートメントの「ハードコーディング」は非効率的で、悪い習慣です。

0

値リストをXMLとしてストアドプロシージャに送信できます。 XMLをテーブル変数に展開し、existsを使用して更新する必要がある行を見つけます。このような

create procedure YourSP 
    @XMLParam xml 
as 

declare @T table(id1 int, id2 int) 

insert into @T(id1, id2) 
select T.N.value('id1[1]', 'int'), 
     T.N.value('id2[1]', 'int') 
from @XMLParam.nodes('/Row') as T(N) 

update table_name 
set bool = 'T' 
where exists (select * 
       from @T as T 
       where T.id1 = table_name.id1 and 
        T.id2 = table_name.id2) 

コール:

exec YourSP '<Row> 
       <id1>1</id1> 
       <id2>1</id2> 
      </Row> 
      <Row> 
       <id1>2</id1> 
       <id2>1</id2> 
      </Row>' 
関連する問題