SQL从逗号分隔列表中选择值

时间:2012-12-06 19:04:09

标签: sql sql-server

我的数据库中有一个名为“Notes”的字段。它包含以逗号分隔的值列表。

我想执行一个SELECT Query,它只返回“Notes”字段中的第一个值。

此查询还将返回数据库中的其他字段。

例如

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

这可能,我该怎么做?

4 个答案:

答案 0 :(得分: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 |

正如评论中所提到的,您应该规范化您的结构,并且不要在一个属性中存储多个值。

答案 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()