在存在给定数据的情况下,查询从n列中选择一列数据

时间:2017-11-03 09:14:19

标签: sql-server

表格(例如:testdata)有5列现金限额数据,例如:CashLimitAnnual,CashLimitQuarter,CashLimitMonth,CashLimitWeekly,CashLimitDaily。

我想编写一个sql查询,只选择有数据的列,否则忽略其他列,因为这些列中只有1个可以随时拥有数据(其他值的值为0000000或00000000)。 在仅比较两列时,我正在尝试查询:

select a.CompanyNumber, b.CoName, a.AutoDirectDebitInd,a.OptCashMinimum as Minimum,
(select case when 
     a.OptCashLimitMonth = '00000000' then  a.OptCashLimitAnnual 
     else a.OptCashLimitMonth end as Test) as Test      
from SQLcheck.dividend.dbo.testdata a, dbo.testcompany b 
where a.CompanyNumber=1234 and a.CompanyNumber = b.CoNumber      

如何比较5列?

3 个答案:

答案 0 :(得分:0)

可能您可以尝试使用COALESCE函数返回没有NULL值的列

所以

SELECT COALESCE(NULL, NULL, 1234, NULL, 789);

结果:1​​234

但请确保所有其他字段中的值为null,否则您可以使用替换在选择查询期间使其为NULL

SELECT COALESCE(REPLACE(COL1,'000',NULL), NULL, 1234, NULL, 789);

点击此链接了解详情:Coalesce

答案 1 :(得分:0)

您可以使用COALESCENULLIF(在用''替换前导零之后)

SELECT 
    CashLimit = COALESCE(
       NULLIF(SUBSTRING(a.CashLimitAnnual,  PATINDEX('%[^0]%', a.CashLimitAnnual+'.'),  LEN(a.CashLimitAnnual)), ''),
       NULLIF(SUBSTRING(a.CashLimitQuarter, PATINDEX('%[^0]%', a.CashLimitQuarter+'.'), LEN(a.CashLimitQuarter)), ''),
       NULLIF(SUBSTRING(a.CashLimitMonth,   PATINDEX('%[^0]%', a.CashLimitMonth+'.'),   LEN(a.CashLimitMonth)), ''),
       NULLIF(SUBSTRING(a.CashLimitWeekly,  PATINDEX('%[^0]%', a.CashLimitWeekly+'.'),  LEN(a.CashLimitWeekly)), ''),
       NULLIF(SUBSTRING(a.CashLimitDaily,   PATINDEX('%[^0]%', a.CashLimitDaily+'.'),   LEN(a.CashLimitDaily)), ''),
    )
FROM   sqlcheck.dividend.dbo.testdata a, 
       dbo.testcompany b 
WHERE  a.companynumber = 1234 
       AND a.companynumber = b.conumber 

COALESCE将采用不是NULL的第一个参数。 NULLIF将离开NULLS并将其他值视为NULL,在这种情况下为空字符串。 SUBSTRING将从列中删除所有(前导)零以获取空字符串,如果它用零填充,则将其视为NULL

答案 2 :(得分:0)

我建议你“取消”这些列,然后使用这种方法呈现非空值,你将知道数字代表什么,这是基于合并的方法所不能做到的。

我建议“unpivot”使用交叉应用和值,而不是unpivot功能,我发现下面的方法更直接,更直观。

SELECT
      a.CompanyNumber
    , b.CoName
    , ca.type
    , SUBSTRING(ca.value,  PATINDEX('%[^0]%', ca.value+'.'),  LEN(ca.value))
FROM SQLcheck.dividend.dbo.testdata a
INNER JOIN dbo.testcompany b ON a.CompanyNumber = b.CoNumber
CROSS APPLY (
      VALUES
              ('CashLimitAnnual', CashLimitAnnual)
            , ('CashLimitQuarter', CashLimitQuarter)
            , ('CashLimitMonth', CashLimitMonth)
            , ('CashLimitWeekly', CashLimitWeekly)
            , ('CashLimitDaily', CashLimitDaily)
      ) ca (type, value)
INNER JOIN dbo.testcompany b ON a.CompanyNumber = b.CoNumber
WHERE a.CompanyNumber = 1234
AND ca.value IS NOT NULL
;

我毫不掩饰地借用蒂姆·施梅特尔(Tim Schmelter)剥离领先零的方法,但这不是我建议的真正焦点。