2011-03-10 170 views
4

我想選擇某個列是否以某個字符串開頭的布爾值。SQLServer - 如果列以字符串開頭,則選擇布爾值

SELECT (name LIKE 'foo%') AS isFoo FROM bar; 

有沒有辦法做到這一點,而不使用內聯CASE

+0

這裏是一個很好的討論這個主題:http://stackoverflow.com/questions/3095538/is-there-a-way-to-get-a-boolean-without-casting-in-sql-server – 2011-03-10 19:45:26

+0

爲什麼你最初想要避免「CASE」? – 2011-03-10 20:04:23

+0

我只是在不需要創建UDF的情況下尋找不太冗長的語法。 – 2011-03-10 22:03:44

回答

17

沒有

在SQL服務器既隱含布爾CAST,也不是一個布爾類型

SELECT CAST(CASE WHEN name LIKE 'foo%' THEN 1 ELSE 0 END AS bit) AS isFoo 
FROM bar; 
+0

如果他們有一個'BeginsWith()'或返回了一些東西,會很好。 – 2011-03-10 19:59:32

2

創建一個用戶定義的函數,您可以調用inorder來檢查名稱是否包含foo。

1

不採取從GBN提出什麼遙遠,但我認爲這將是更有效(但本質相同事情)

SELECT CAST(CASE WHEN LEFT(name, 3)='foo' THEN 1 ELSE 0 END AS bit) AS isFoo 
FROM bar; 
+1

由於您觸摸了表格中的每一行,所以結果相同。通常,SELECT中的表達式比JOIN,WHERE和GROUP BY要便宜得多。 – gbn 2011-03-10 19:42:44

+0

這是一個好點 – 2011-03-10 20:02:10

0
SELECT 
    CASE WHEN name LIKE 'foo%'   
    THEN 1 
    ELSE 0 
    END as isFoo 

    FROM bar 
+0

OP指定'CASE'是要避免的。 – 2011-03-10 19:43:20

3

一個UNION操作將讓英語新kip a CASE聲明通過組合兩個結果集。在第一個查詢您篩選匹配'foo%'和第二你匹配不匹配'foo%'

喜歡的東西的所有行的所有行:

SELECT 1 AS [YourBoolean], 'fool' WHERE 'fool' LIKE 'foo%' 
UNION 
SELECT 0, 'fuel' WHERE 'fuel' NOT LIKE 'foo%' 
ORDER BY 1 

(硬編碼例如W/O目標表。 )

+0

這會觸碰表格兩次=表現不佳。只是爲了避免使用CASE? – gbn 2011-03-10 19:45:47

+0

是的,這不是一個理想的解決方案。但我會給他一個答覆,以回答如何避免這種情況! – 2011-03-10 19:57:30

+0

@gbn:我完全同意這個表現。我不知道OP爲什麼要避免使用CASE,但它似乎是一個有趣的難題來解決。 @jcm:謝謝! – 2011-03-10 20:01:38

4

你甚至不需要投根據您的使用:

SELECT CAST(PATINDEX('foo%'), name) AS bit) FROM bar 

如果山坳與文中另有0開始,這將返回1沒有涉及CASE

+0

好想法。儘管有點模糊,依靠比特轉換如何工作 – gbn 2011-03-10 19:50:20

相關問題