2011-06-30 79 views
1

Evidentally,我不能做到這一點:布爾邏輯在SELECT子句中

SELECT 
    SUM(t.MyField IS NULL) AS totalNulls, 
    SUM(t.MyField LIKE '[0-9]') AS totalNumbers 
FROM MyTable AS t; 

我不知道爲什麼這些不工作,因爲在SQL布爾只是數字(0和1)。但是我得到的錯誤表明,在select子句中的任何地方都有'null'或'like'是不合法的。爲什麼他們不合法?正如上面的(僞)SQL建議的那樣,我如何達到預期的效果?

+0

布爾在ANSI SQL不是* 0和1.這可能是在某些品牌的RDBMS中實現的副作用,但在SQL語言中不是這樣。 –

+0

MyField列的數據類型是什麼? –

回答

0

如果您的數據沒有被索引的查詢欄,你應該使用基於案例的解決方案阿龍建議,因爲該行纔會被查詢一次。

select totalNulls = sum(case when MyField is null then 1 else 0 end), 
     totalNumbers = sum(case when MyField like '[0-9]' then 1 else 0 end) 
from MyTable; 

你應該知道你只接受例如在這種情況下,'7'作爲數字不是'12'。 如果你想接受任何號碼,你應該去問

... when MyField not like '%[^0-9]%' ... 

在這種情況下,你可以使用ISNUMERIC做一個魅力:

select totalNonNumbers = count(*) - sum(isnumeric(MyField)), 
     totalNumbers = sum(isnumeric(MyField)) 
from MyTable; 

如果列索引的邁克爾斯解決方案的變化可能是最快的:

select totalNulls = (select count(*) from MyTable where MyField is null), 
     totalNumbers = 
      (select count(*) from MyTable where MyField between '0' and '9'); 

有這麼多的方法...

0

一種方法是:

SELECT 
    count(*) AS totalNulls, 
    0 as totalNumbers 
FROM MyTable AS t 
where t.MyField is null 
union 
SELECT 
    0 AS totalNulls, 
    count(t.MyField) AS totalNumbers 
FROM MyTable AS t 
where t.MyField like '[0-9]'; 

第一行會包含空計數,第二排將包含包含數字t.MyField的總數。

1

SELECT SUM(CASE WHEN t.MyField爲null,則1 ELSE 0 END)作爲TotalNulls

我不認爲比較符返回1和0,我認爲他們的處理不同,但我在這一點上不確定,但是case語句的總和將會起作用,並且您可以在一次傳遞中進行儘可能多的列/計算。

5

SQL Server不知道什麼是布爾值。 BIT <>布爾值,儘管這是一個常見的誤解。您也不能在SELECT語句(例如IF)中進行控制流的事情。在下一個版本的SQL Server中,我們獲得了內聯IIF()功能,這種功能可以滿足您的需求。同時,您需要使用CASE表達式。

SELECT 
    totalNulls = SUM(CASE WHEN t.MyField IS NULL  THEN 1 ELSE 0 END), 
    totalNumbers = SUM(CASE WHEN t.MyField LIKE '[0-9]' THEN 1 ELSE 0 END) 
FROM MyTable AS t; 
-1

另一種方式......

declare @t table (
    id int null 
) 
insert into @t 
select 1 
union 
select null 
union 
select 2 

SELECT 
    totalNulls = COUNT(*)-COUNT(ID), 
    totalNumbers = SUM(CASE WHEN ISNUMERIC(t.id)=1 THEN 1 ELSE 0 END) 
FROM @t AS t; 
+0

謝謝takrl的編輯...是第一篇文章,並沒有知道我的格式化規則,現在慢慢地得到它的一竅不通。 – Ram