首先查看此代码。我觉得它应该适合我,但事实并非如此! (惊喜!)
无论如何,这是我先试过的:
SELECT
Status as status,
Address as ip,
PCName as pc_name,
(Numbers.Phone = 'CPU/' + PCName) as cpu_contact,
(Numbers.Phone = 'PC/' + PCName) as pc_contact,
(Numbers.Phone = 'LOGIN/' + PCName) as login_contact,
FROM IPAddress
WHERE $where --Generated In code
JOIN Numbers
ON ('CPU/' + PCName = Numbers.Phone)
OR ('PC/' + PCName = Numbers.Phone)
OR ('LOGIN/' + PCName = Numbers.Phone)
所以我想要的是一些布尔计算字段并在类似条件下加入。我还希望结果可以折叠成单行。例如,我认为当前的设置会做这样的事情:
status ip cpu_contact pc_contact login_contact
-----------------------------------------------
foo bar true false false
foo bar false true false
foo bar false false true
显然我宁愿
status ip cpu_contact pc_contact login_contact
-----------------------------------------------
foo bar true true true
有什么想法吗?数据库重新设计不是一种选择。如果是的话,我会这样做: - )
答案 0 :(得分:4)
您可以使用GROUP BY
和SUM
折叠行:
SELECT
Status as status, Address as ip, PCName as pc_name,
cast(sum(case when (Numbers.Phone = 'CPU/' + PCName) then 1 else 0 end) as bit)
as cpu_contact,
cast(sum(case when (Numbers.Phone = 'PC/' + PCName) then 1 else 0 end)) as bit)
as pc_contact,
cast(sum(case when (Numbers.Phone = 'LOGIN/' + PCName) then 1 else 0 end) as bit)
as login_contact,
FROM
IPAddress
JOIN Numbers ON
('CPU/' + PCName = Numbers.Phone) OR ('PC/' + PCName = Numbers.Phone) OR
('LOGIN/' + PCName = Numbers.Phone)
WHERE
$where --Generated In code
GROUP BY
Status, Address, PCName
由于您正在执行逻辑或行之间的操作,因此零之和为false,而任何大于0的值都为true。
答案 1 :(得分:1)
您需要使用Case / When进行比较。在这种情况下,我硬编码1或0,但T-SQL会将硬编码的数字转换为int。如果你想要布尔(位),你需要手动转换它,就像这样......
Convert(Bit, Case When Numbers.Phone = 'CPU/' + PCName Then 1 Else 0 End) as cpu_contact,
Convert(Bit, Case When Numbers.Phone = 'PC/' + PCName Then 1 Else 0 End) as pc_contact,
Convert(Bit, Case When Numbers.Phone = 'LOGIN/' + PCName Then 1 Else 0 End) as login_contact,
答案 2 :(得分:1)
SELECT
Status as status,
Address as ip,
PCName as pc_name,
case when sum(case when Numbers.Phone = 'CPU/' + PCName then 1 end) > 0 then 'true' else 'false' end as cpu_contact,
case when sum(case when Numbers.Phone = 'PC/' + PCName then 1 end) > 0 then 'true' else 'false' end as pc_contact,
case when sum(case when Numbers.Phone = 'LOGIN/' + PCName then 1 end) > 0 then 'true' else 'false' end as login_contact
FROM IPAddress
JOIN Numbers
ON ('CPU/' + PCName = Numbers.Phone)
OR ('PC/' + PCName = Numbers.Phone)
OR ('LOGIN/' + PCName = Numbers.Phone)
WHERE -- your condition goes here
group by status, address, pc_name