我的數據庫中有一個名爲「Notes」的字段。它包含逗號分隔的值列表。SQL從逗號分隔列表中選擇值
我想執行一個SELECT查詢,它只返回「Notes」字段中的第一個值。
此查詢還會返回數據庫中的其他字段。
例如
SELECT Name, Phone, Notes (only the first value)
FROM Table1
這是可能的,我該怎麼辦呢?
我的數據庫中有一個名爲「Notes」的字段。它包含逗號分隔的值列表。SQL從逗號分隔列表中選擇值
我想執行一個SELECT查詢,它只返回「Notes」字段中的第一個值。
此查詢還會返回數據庫中的其他字段。
例如
SELECT Name, Phone, Notes (only the first value)
FROM Table1
這是可能的,我該怎麼辦呢?
您可以使用CHARINDEX
與SUBSTRING
:
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 |
如共同提到的您應該規範化您的結構,並且不要在單個屬性中存儲多個值。
你的子串不應該從1開始? –
@JordanKaye手冊狀態*「如果start小於1,則返回的表達式將從表達式」*「中指定的第一個字符開始。所以我假設'0'會轉到'1'。 – Kermit
確實如此,但由於SQL字符串通常是1索引的,因此對它們進行處理可能是有意義的。防止使用其他功能(如CHARINDEX)時出現混淆。 –
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
聽起來像是你的 '注意事項' 一欄真的是一對多的數據關係。你有可能改變你的模式來將'Notes'中的逗號分隔數據分割成單獨的表中的行嗎?這樣更容易查詢。性能會更好 - 您描述的查詢將需要字符串操作,並導致「表掃描」,只會隨着表的增長而變得更糟。 – n8wrl
還有一個關於標記字符串的類似問題。 http://stackoverflow.com/questions/6209658/transact-sql-how-do-i-tokenize-a-string – Suirtimed
不是我的筆記專欄,別人的,我不幸被卡住了。 – Hunter