101

次のような優先順位に基づいて、テーブルからデータを選択する必要があります。

select product, price from table1 where project = 1

-- pseudo: if no price found, do this:
select product, price from table1 where customer = 2

-- pseudo: if still no price found, do this:
select product, price from table1 where company = 3

つまり、に基づく価格の商品を3つ見つけた場合、project = Xを選択したくありませんcustomer = Y。結果の3行を返して完了したいだけです。

SQLでこのようなことをどのように行うことになっていますか?疑似ifに何らかのCASEステートメントを使用しますか?組合やその他の賢いことをしますか?

編集:私はMSSQLを使用しています。

ありがとう!

4

7 に答える 7

109

次のSQLクエリを作成できます

IF ((SELECT COUNT(*) FROM table1 WHERE project = 1) > 0) 
    SELECT product, price FROM table1 WHERE project = 1
ELSE IF ((SELECT COUNT(*) FROM table1 WHERE project = 2) > 0) 
    SELECT product, price FROM table1 WHERE project = 2
ELSE IF ((SELECT COUNT(*) FROM table1 WHERE project = 3) > 0)
    SELECT product, price FROM table1 WHERE project = 3
于 2013-02-26T09:57:36.863 に答える
31

CASEステートメントはSQLのIFステートメントに最も近く、SQLServerのすべてのバージョンでサポートされています。

SELECT CASE <variable> 
           WHEN <value>      THEN <returnvalue> 
           WHEN <othervalue> THEN <returnthis> 
           ELSE <returndefaultcase> 
       END 
  FROM <table> 
于 2013-02-26T09:56:43.237 に答える
17

使用する代わりに、使用EXISTSするCOUNTだけ@@ROWCOUNTです:

select product, price from table1 where project = 1

IF @@ROWCOUNT = 0
BEGIN
    select product, price from table1 where customer = 2

    IF @@ROWCOUNT = 0
    select product, price from table1 where company = 3
END
于 2013-02-26T10:00:47.043 に答える
2

SQL Serverでは、IF / THENロジックの代わりにCTEを使用するだけで、既存のクエリから簡単にマッピングし、関連するクエリの数を変更できます。

WITH cte AS (
    SELECT product,price,1 a FROM table1 WHERE project=1   UNION ALL
    SELECT product,price,2 a FROM table1 WHERE customer=2  UNION ALL
    SELECT product,price,3 a FROM table1 WHERE company=3
)
SELECT TOP 1 WITH TIES product,price FROM cte ORDER BY a;

でテストするSQLfiddle

または、すべてを1つにまとめSELECTて、オプティマイザー用に単純化することもできます。

SELECT TOP 1 WITH TIES product,price FROM table1 
WHERE project=1 OR customer=2 OR company=3
ORDER BY CASE WHEN project=1  THEN 1 
              WHEN customer=2 THEN 2
              WHEN company=3  THEN 3 END;

別のSQLfiddle

于 2013-02-26T10:26:23.990 に答える
1

これが役立つかどうかを確認してください。

select TOP 1
    product, 
    price 
from 
    table1 
where 
    (project=1 OR Customer=2 OR company=3) AND
    price IS NOT NULL
ORDER BY company 
于 2013-02-26T10:05:04.757 に答える
0

ケースステートメントがありますが、以下の方がより正確/効率的/読みやすいと思います。

select 
  product
  ,coalesce(t4.price,t2.price, t3.price) as price
from table1 t1
left join table1 t2 on t1.product = t2.product and t2.customer =2
left join table1 t3 on t1.product = t3.product and t3.company =3
left join table1 t4 on t1.product = t4.product and t4.project =1
于 2013-02-26T10:02:46.053 に答える
0

-ほとんどの場合、上記と同様の回答。テスト用に含まれているコード

DROP TABLE table1
GO
CREATE TABLE table1 (project int, customer int, company int, product int, price money)
GO
INSERT INTO table1 VALUES (1,0,50, 100, 40),(1,0,20, 200, 55),(1,10,30,300, 75),(2,10,30,300, 75)
GO
SELECT TOP 1 WITH TIES product
        , price
        , CASE WhereFound WHEN 1 THEN 'Project'
                WHEN 2 THEN 'Customer'
                WHEN 3 THEN 'Company'
            ELSE 'No Match'
            END AS Source
FROM 
    (
     SELECT product, price, 1 as WhereFound FROM table1 where project = 11
     UNION ALL
     SELECT product, price, 2 FROM table1 where customer = 0
     UNION ALL
     SELECT product, price, 3 FROM table1 where company = 30
    ) AS tbl
ORDER BY WhereFound ASC
于 2014-02-26T21:45:00.713 に答える