选择具有优先级条件的列

时间:2014-05-27 17:21:59

标签: sql sql-server-2008 tsql

我需要根据目前的语言从表格中选择细节。也就是说,我有一个主要的语言文化和一个中学文化。我需要为主要选择具有匹配行的行,如果有其他我需要为二级文化选择匹配的行。我有超过5个不同的表加入所有将具有相同的条件。

我的表

ID           int    
Name     nvarchar(50)   
MasterKey    tinyint    
Culture  nvarchar(50)

必需输出

Name     Culture
-----    -------
@#@$      en-AR

查询

  declare
    @Primary  nvarchar(20) = 'en-AR'
    ,@Secondary nvarchar(20) = 'en-US'
    SELECT 
       LangTable1.Name AS Name
       ,LangTable1.Culture AS Culture
    FROM
       LangTable1
    WHERE
       LangTable1.Culture=case WHEN LangTable1.Culture=@Primary THEN @Primary
    ELSE @Secondary

结果

Name       Culture
-----      -------

Minhaj     en-US
@#@$       en-AR
Nann       en-US

3 个答案:

答案 0 :(得分:1)

其他两种方法是使用UNION

第一个查询删除辅助语言的值,这些值与使用EXIST

检查的主要语言的值重复
DECLARE @primary nvarchar(20) = 'en-AR'
DECLARE @secondary nvarchar(20) = 'en-US'

SELECT Name, Culture
FROM   LangTable1
WHERE  Culture = @primary
UNION ALL
SELECT Name, Culture
FROM   LangTable1 a
WHERE  Culture = @secondary
  AND  NOT EXISTS (SELECT 1
                   FROM   LangTable1 b
                   WHERE  a.Name = b.Name
                     AND  b.Culture = @primary)

第二个查询使用EXCEPT

删除与主要语言值重复的辅助语言的值
DECLARE @primary nvarchar(20) = 'en-AR'
DECLARE @secondary nvarchar(20) = 'en-US'

SELECT Name, Culture
FROM   LangTable1
WHERE  Culture = @secondary
EXCEPT  
SELECT Name, @secondary
FROM   LangTable1
WHERE  Culture = @primary
UNION ALL
SELECT Name, Culture
FROM   LangTable1
WHERE  Culture = @primary

答案 1 :(得分:0)

不确定你要的是什么

if exists(select name, culture from LangTable1 where culture=@Primary)
  begin
  select name, culture from LangTable1 where culture=@Primary
  end
else
  begin
  select name, culture from LangTable1 where culture=@secondary
  else
end

答案 2 :(得分:0)

这可能会给你你想要的东西:

;with cte(Name, Culture, CultureRank) as
(
select t.Name, t.Culture, case when t.Culture = @primary then 1 when t.culture = @secondary then 2 else 3 end CultureRank
from LangTable1 t
) 

select c.Name, c.Culture
from cte c
where c.CultureRank < 3
and c.CultureRank = (select MIN(CultureRank) from cte c2 where c2.Name = c.Name)

SQL Fiddle