我想選擇某個列是否以某個字符串開頭的布爾值。SQLServer - 如果列以字符串開頭,則選擇布爾值
SELECT (name LIKE 'foo%') AS isFoo FROM bar;
有沒有辦法做到這一點,而不使用內聯CASE
?
我想選擇某個列是否以某個字符串開頭的布爾值。SQLServer - 如果列以字符串開頭,則選擇布爾值
SELECT (name LIKE 'foo%') AS isFoo FROM bar;
有沒有辦法做到這一點,而不使用內聯CASE
?
沒有
在SQL服務器既隱含布爾CAST,也不是一個布爾類型
SELECT CAST(CASE WHEN name LIKE 'foo%' THEN 1 ELSE 0 END AS bit) AS isFoo
FROM bar;
如果他們有一個'BeginsWith()'或返回了一些東西,會很好。 – 2011-03-10 19:59:32
創建一個用戶定義的函數,您可以調用inorder來檢查名稱是否包含foo。
不採取從GBN提出什麼遙遠,但我認爲這將是更有效(但本質相同事情)
SELECT CAST(CASE WHEN LEFT(name, 3)='foo' THEN 1 ELSE 0 END AS bit) AS isFoo
FROM bar;
由於您觸摸了表格中的每一行,所以結果相同。通常,SELECT中的表達式比JOIN,WHERE和GROUP BY要便宜得多。 – gbn 2011-03-10 19:42:44
這是一個好點 – 2011-03-10 20:02:10
SELECT
CASE WHEN name LIKE 'foo%'
THEN 1
ELSE 0
END as isFoo
FROM bar
OP指定'CASE'是要避免的。 – 2011-03-10 19:43:20
一個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目標表。 )
這會觸碰表格兩次=表現不佳。只是爲了避免使用CASE? – gbn 2011-03-10 19:45:47
是的,這不是一個理想的解決方案。但我會給他一個答覆,以回答如何避免這種情況! – 2011-03-10 19:57:30
@gbn:我完全同意這個表現。我不知道OP爲什麼要避免使用CASE,但它似乎是一個有趣的難題來解決。 @jcm:謝謝! – 2011-03-10 20:01:38
你甚至不需要投根據您的使用:
SELECT CAST(PATINDEX('foo%'), name) AS bit) FROM bar
如果山坳與文中另有0開始,這將返回1沒有涉及CASE
。
好想法。儘管有點模糊,依靠比特轉換如何工作 – gbn 2011-03-10 19:50:20
這裏是一個很好的討論這個主題:http://stackoverflow.com/questions/3095538/is-there-a-way-to-get-a-boolean-without-casting-in-sql-server – 2011-03-10 19:45:26
爲什麼你最初想要避免「CASE」? – 2011-03-10 20:04:23
我只是在不需要創建UDF的情況下尋找不太冗長的語法。 – 2011-03-10 22:03:44