2

レポートに 2 つの列を表示する必要があります。その値は、次の同じ入力式を使用して決定されます。

SELECT     
CASE WHEN id>10

THEN 'AAAA'
 ELSE 
  'BBBB' 
 END as 'FirstColumn',  

CASE WHEN id>10

THEN 
  'BBBB' 
ELSE 
  'DDDD' END as 'SecondColumn'   

入力式は同じなので、入力式を 2 回繰り返さずにこの式を作成できますか?

4

5 に答える 5

1

その代わりに洗練されたものが想定されている場合はid>10、少し短くして読みやすくするために:

select
  IIF(p.b=1, 'AAA', 'BBB') [Col1],
  IIF(p.b=1, 'BBB', 'DDD') [Col2]
from
  TableName t
  outer apply (select cast(case when t.id>10 then 1 else NULL end as bit) as b) p

ただし、これは SqlServer 2012 でのみ使用できます。以前のバージョンでは、おそらく、独自の IIF のようなスカラー関数を作成する必要があります。

create function dbo.IIF (@b bit, @ifValue varchar(50), @elseValue varchar(50))
returns varchar(50)
as begin
  return (select case when @b = 1 then @ifValue else @elseValue end)
end
GO

select
  dbo.IIF(p.b, 'AAA', 'BBB') [Col1],
  dbo.IIF(p.b, 'BBB', 'DDD') [Col2]
from
  TableName t
  outer apply (select cast(case when t.id>10 then 1 else NULL end as bit) as b) p
于 2013-07-25T17:46:48.967 に答える
0

手間をかける価値がある場合は、この変換ロジックを実行するユーザー定義関数 (UDF) を作成できます。

 CREATE FUNCTION dbo.fColTransform(@id Int)
     RETURNS Varchar(20)
 AS BEGIN
    DECLARE @ret Varchar(20)

    SET @ret = 
       CASE 
          WHEN @id IS NULL THEN 'Unknown'
          WHEN @id > 10 THEN 'BBB'
          ELSE 'DDD'
       END
    RETURN @ret
 END

次に、SELECT で、次のように構造化できます。

 SELECT dbo.fColTransform(id1) AS FirstColumn,
        dbo.fColTransform(id2) AS SecondColumn
  FROM MyTable
于 2013-07-25T17:44:58.460 に答える
0

それを変数に格納し、それを使用Executeして呼び出すことができます。

Declare @foo as nvarchar(max)
set @foo='MyTable'
execute ('Select * from ' + @foo)

欠点は、クエリ全体がすべて赤くなることです (現在は文字列であるため)。

于 2013-07-25T17:47:20.937 に答える
0

このクエリを試してみてください。おそらく役に立つでしょう (関数を使用しない場合):

WITH temp AS (
  SELECT     
    CASE WHEN x.ID > 10
      THEN 'AAAA'
      ELSE 'BBBB' 
    END as Col
  FROM (
        SELECT 1 AS ID
        UNION
        SELECT 11 AS ID
        UNION
        SELECT 13 AS ID
        UNION
        SELECT 9 AS ID
        UNION
        SELECT 7 AS ID  
  ) x
)
SELECT temp.Col AS  FirstColumn, temp.Col AS SecondColumn 
FROM temp 

基本的:

With name As (
     /*yourquery with one CASE-COLUMN*/
)
SELECT name.COL AS COLUMN1, name.COL AS COLUMN2 FROM name

ここでこれを試すことができます

于 2013-07-25T17:48:25.747 に答える