2013-07-25 3 views
2

У меня есть требование для отображения двух столбцов в отчете, значения которых будет определяться с использованием того же выражения ввода следующим образом:Написания саз в SQL

SELECT  
CASE WHEN id>10 

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

CASE WHEN id>10 

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

Могу ли я построить это выражение без повторяющегося входного выражения дважды как они такие же?

+0

Что вы подразумеваете под «входным выражением»? Это не стандартная часть терминологии SQL, и заставило меня думать, что вы ссылаетесь на параметризованное выражение в своем запросе (которого нет в вашем запросе). –

+1

действительно: http://www.smallsql.de/doc/sql-functions/system/case.html –

+0

microsoft также использует «входное выражение»: http://msdn.microsoft.com/en-us/library /ms187347.aspx –

ответ

1

Вам нужно будет повторить регистрацию CASE для каждого поля, так как условие может быть таким же, как и результаты отличаются. Единственной альтернативой является использование оператора UNION all, когда первый выбор принимает записи WHERE id < = 10, а другой - идентификатор WHERE> 10. Это может быть жизнеспособной альтернативой, но она является владельцем littel для поддержания, поэтому, если производительность достаточно хорошая, Iwoudl придерживается повторения условия CASE.

0

Если это стоит свеч, вы могли бы создал определяемые пользователем функции (UDF), которые могли бы сделать эту transforamation логику:

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 
+0

Но в Funtion также я должен написать выражение дважды, поскольку мое условие постоянное, но результат varries для разных столбцов. – user1672097

+0

Затем вы выполняете различную логику для каждого столбца. Это сложно отвлечь. В зависимости от того, сколько раз вы его используете, вы можете передать значения «меньше 10» и «больше 10» в качестве дополнительных параметров.Это не сэкономит ваше время, но может улучшить читаемость кода. Если вы сделаете это, вы назовете его как 'SELECT dbo.fColTransform (id1, 'AAA', 'BBB')'. – Curt

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. В более ранних версиях, parhaps, вам придется написать свою собственную функцию 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 
0

Вы можете сохранить его в переменной и использовать Execute для назовите это:

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

Недостатком является то, что весь ваш запрос будет все красным (поскольку теперь это строка).

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 

Вы можете попробовать это here