2012-12-06 91 views
-1

我的數據庫中有一個名爲「Notes」的字段。它包含逗號分隔的值列表。SQL從逗號分隔列表中選擇值

我想執行一個SELECT查詢,它只返回「Notes」字段中的第一個值。

此查詢還會返回數據庫中的其他字段。

例如

SELECT Name, Phone, Notes (only the first value) 
FROM Table1 

這是可能的,我該怎麼辦呢?

+1

聽起來像是你的 '注意事項' 一欄真的是一對多的數據關係。你有可能改變你的模式來將'Notes'中的逗號分隔數據分割成單獨的表中的行嗎?這樣更容易查詢。性能會更好 - 您描述的查詢將需要字符串操作,並導致「表掃描」,只會隨着表的增長而變得更糟。 – n8wrl

+0

還有一個關於標記字符串的類似問題。 http://stackoverflow.com/questions/6209658/transact-sql-how-do-i-tokenize-a-string – Suirtimed

+0

不是我的筆記專欄,別人的,我不幸被卡住了。 – Hunter

回答

2

您可以使用CHARINDEXSUBSTRING

SELECT Name, Phone, SUBSTRING(Notes, 1, CHARINDEX(',', Notes)) AS first_value 
FROM Table1 

演示

DECLARE @csv varchar(50) 
SET @csv = 'comma after this, and another,' 

SELECT SUBSTRING(@csv, 1, CHARINDEX(',', @csv)) AS first_value 

結果

|  first_value | 
-------------------- 
| comma after this |

如共同提到的您應該規範化您的結構,並且不要在單個屬性中存儲多個值。

+0

你的子串不應該從1開始? –

+0

@JordanKaye手冊狀態*「如果start小於1,則返回的表達式將從表達式」*「中指定的第一個字符開始。所以我假設'0'會轉到'1'。 – Kermit

+0

確實如此,但由於SQL字符串通常是1索引的,因此對它們進行處理可能是有意義的。防止使用其他功能(如CHARINDEX)時出現混淆。 –

2
SELECT Name, Phone, Left(Notes, CharIndex(',', Notes + ',')) FirstNote 
    FROM Table1 

您需要在CHARINDEX的Notes + ','位才能正常工作 - 看到這個例子(我已經包括NJK的答案)

with Table1(Name, Phone, Notes) as (
    select 'abc', '123', 'Some,notes,here' union all 
    select 'abd', '124', 'Single-note' union all 
    select 'abe', '125', '' union all 
    select 'syz', '126', null 
) 
--- 
SELECT Name, Phone, Left(Notes, CharIndex(',', Notes + ',')-1) FirstNote 
     ,SUBSTRING(Notes, 0, CHARINDEX(',', Notes)) AS njk 
    FROM Table1 

結果

Name Phone FirstNote  njk 
---- ----- --------------- --------------- 
abc 123 Some   Some 
abd 124 Single-note  
abe 125     
syz 126 NULL   NULL