表格(例如: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列?
答案 0 :(得分:0)
可能您可以尝试使用COALESCE函数返回没有NULL值的列
所以
SELECT COALESCE(NULL, NULL, 1234, NULL, 789);
结果:1234
但请确保所有其他字段中的值为null,否则您可以使用替换在选择查询期间使其为NULL
SELECT COALESCE(REPLACE(COL1,'000',NULL), NULL, 1234, NULL, 789);
点击此链接了解详情:Coalesce
答案 1 :(得分:0)
您可以使用COALESCE
和NULLIF
(在用''
替换前导零之后)
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)剥离领先零的方法,但这不是我建议的真正焦点。