如何在不重复子句的情况下分配多个变量

时间:2019-01-09 21:34:35

标签: sql-server tsql

我大约有10个变量,在我的select语句中都需要填充这些变量。

这全部由语言代码驱动,如果“英语”将所有变量设置为英语,否则设置为母语。

我遇到的问题是很多重复代码,我想知道在CASE中填充多个变量的最佳方法是什么。

我当前的代码

DECLARE
@x nvarchar(200),
@y nvarchar(200),
@z nvarchar(200)

SELECT
    @x = CASE WHEN @language like '%english%'
            THEN                                        
                T.washroom_English
            ELSE                                            
                T.washroom
        END,
    @y = CASE WHEN @language like '%english%'
            THEN                                        
                T.bed_English
            ELSE                                            
                T.bed
        END,
    @z = CASE WHEN @language like '%english%'
            THEN                                        
                T.kitchen_English
            ELSE                                            
                T.kithen
        END
FROM house as T

3 个答案:

答案 0 :(得分:1)

您可以使用一个查询,该查询将根据您的@language变量按语言(英语或英语)生成行。 UNION ALL结果将具有与上方查询相同的列名。

然后,您可以从子查询中为变量分配一个静态列名称。

  SELECT @x = washroom
       , @y = bed
       , @z = kitchen
FROM   ( SELECT T.washroom
              , T.bed
              , T.kitchen
         FROM   house AS T
         WHERE  @language NOT LIKE '%english%'
         UNION ALL
         SELECT T.washroom_English
              , T.bed_English
              , T.kitchen_English
         FROM   house AS T
         WHERE  @language LIKE '%english%' 
       ) data 

答案 1 :(得分:0)

Try my little trick

DECLARE @English NVARCHAR(10) = '_English'
DECLARE @Fields NVARCHAR(500) = 'washroom,bed,kithen,'
DECLARE @TableName NVARCHAR(50) = 'house'
DECLARE @ColumnValue NVARCHAR(100)
DECLARE @Index INT
DECLARE @SelectString NVARCHAR(4000) = 'SELECT ' 
 WHILE CHARINDEX(',', @Fields) > 0
 BEGIN
    SELECT @Index  = CHARINDEX(',', @Fields)  
    SELECT @ColumnValue = SUBSTRING(@Fields, 1, @Index-1)
    SET @SelectString = @SelectString + '''' + @ColumnValue + @English +'''As ' + @ColumnValue + ', '
    SELECT @Fields = SUBSTRING(@Fields, @Index + 1, LEN(@Fields) - @Index)
 END
SELECT @SelectString = SUBSTRING(@SelectString,0, LEN(@SelectString)) + ' From ' + @TableName
SELECT @SelectString  
EXEc sp_sqlexec @SelectString

答案 2 :(得分:0)

不知道我是否正确理解了你,但我的主张是:

DECLARE
@x nvarchar(200),
@y nvarchar(200),
@z nvarchar(200)

IF @language like '%english%'
    SELECT @x = T.washroom_English, @y = T.bed_English, @z = T.kitchen_English FROM house as T
ELSE
    SELECT @x = T.washroom, @y = T.bed, @z = T.kitchen FROM house as T