我的数据库中有一个名为“Notes”的字段。它包含以逗号分隔的值列表。
我想执行一个SELECT Query,它只返回“Notes”字段中的第一个值。
此查询还将返回数据库中的其他字段。
例如
SELECT Name, Phone, Notes (only the first value)
FROM Table1
这可能,我该怎么做?
答案 0 :(得分:2)
您可以将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 :(得分: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
答案 2 :(得分:0)
SELECT name,
phones,
split_part(notes, ',', 1) as first_notes
FROM Table1
从逗号分隔列表中选择值的解决方案
答案 3 :(得分:0)
我一直在寻找一个更通用的答案(不仅是第一个字段,而是一个任意指定的答案),所以我修改了Kermit的答案并将其放在函数中。在这种情况下,它可以帮助节省其他人的时间
const { AsyncSubject } = Rx
const { map } = RxOperators
class Smth {
constructor(options$) {
this.options$ = options$
this.sum = 0
}
append(val) {
this.options$.subscribe(opts => {
this.sum += parseInt(val, opts.base)
// Do I need to unsubscribe from AsyncSubject?
})
}
compute() {
return this.options$.pipe(
map(() => this.sum)
)
}
}
function run() {
var opts$ = new AsyncSubject()
setTimeout(() => { // Opts will be provided later - emulate fetch request
opts$.next({ base: 7 })
opts$.complete()
}, 1000)
var smth = new Smth(opts$)
smth.append("15") // But the arguments are already known
smth.append("5")
smth.append("66")
smth.append("0")
return smth.compute()
}
run()