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)の条件を選択する必要があります。以下のステートメントと同様です。

WHERE id1 = value1 AND id2 = value2

ただし、配列内の値のセット。これは可能ですか?

前もって感謝します

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

4

7 に答える 7

3

これが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')
于 2012-07-26T11:17:06.550 に答える
1

これを実現するための1つのアイデアは、一時テーブルを利用することです。

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
于 2012-07-24T07:07:53.143 に答える
0

これを試してください-SQLServer2008バージョン。

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;
于 2012-07-24T07:12:39.947 に答える
0

SQL Serverを使用している場合は、これを試してください

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

Oracleを使用している場合はこれを試してください

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

一致する値が複数ある場合は、通常、in句を使用します。あなたが(id1=value1およびid2=value2)および(id1=value3およびid2=value4)であると仮定します

     UPDATE table_name
     SET bool = T
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4)
于 2012-07-24T07:07:10.527 に答える
0

このクエリはOracleで機能します...

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

あなたのデータベースはどれですか?

于 2012-07-24T07:26:51.400 に答える
0

あなたは基本的に何をしようとしていますか?なぜこれがあなたがそれをするために選んだ方法ですか?セットベースのロジックを理解するのに少し曖昧なようです。他のポスターによって提供された各回答は有効であり、機能しますが、目的に最も適しているとは限りません。この処理は既存のデータセットに対して行われますか?それはデータのロードまたは挿入プロセスの一部ですか?リストした各IDフィールドには、独自の範囲の一意の値があります。あなたの例に基づいて、あなたが本当にやりたいのはID2=1のときにbool値を更新することであるように見えます

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

たとえば、Id2がId1以下の場合など、何らかのデータルールに基づいてブール値を設定するロジックを開発する必要がある可能性があります。ここでcaseステートメントが機能します。

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

これは、大量のデータセットを処理する場合、挿入する値のバリエーションごとにWHERE句にAND/ORルールを書き込むよりもはるかに効率的です。

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

小さなデータ挿入(テーブルフィールドに手動で値を入力するか、トランザクションごとにある種の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ステートメントの「ハードコーディング」は非効率的であり、入り込むのは悪い習慣です。

于 2012-07-26T00:30:23.037 に答える
0

値のリストをXMLとしてストアドプロシージャに送信できます。XML to table変数を解凍し、を使用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>'
于 2012-07-26T08:58:20.487 に答える