Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择具有优先级条件的列_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 选择具有优先级条件的列

Sql 选择具有优先级条件的列,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我需要根据当前语言从表中选择详细信息。也就是说,我有初级语言文化和中级语言文化。我需要为主要区域性选择具有匹配行的行,如果有其他行,我需要为次要区域性选择匹配行。我有超过5个不同的表加入所有将有相同的条件 我的桌子 所需输出 查询 后果 不知道你要的是什么 if exists(select name, culture from LangTable1 where culture=@Primary) begin select name, culture from LangTable1 whe

我需要根据当前语言从表中选择详细信息。也就是说,我有初级语言文化和中级语言文化。我需要为主要区域性选择具有匹配行的行,如果有其他行,我需要为次要区域性选择匹配行。我有超过5个不同的表加入所有将有相同的条件

我的桌子 所需输出 查询 后果
不知道你要的是什么

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

这可能会给你想要的:

;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)

另外两种方法是使用联合体

第一个查询删除与使用EXIST检查的主语言值重复的辅助语言值

第二个查询使用EXCEPT删除与主语言值重复的辅助语言值


请考虑发布DB模式和期望的输出和业务规则!问题是什么?另外,更具体一点-您只希望返回一种语言,还是希望为传入变量的两种语言选择行?不,我只希望选择一种语言
  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
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
;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)
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)
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