【问题标题】:SQL Select command to selectively extract data from a stringSQL Select 命令选择性地从字符串中提取数据
【发布时间】:2014-10-15 01:18:52
【问题描述】:

我在一列中有数据,其中包含来自应用程序的各个字段的值,所有这些字段都连接到数据库端的一个字段中,并用逗号分隔。 如果应用程序中的字段为空白,则两个逗号之间的值将为空白。

如果填充了每个单独的字段,我需要一个 select 语句来选择它们。我想将每个字段指定为我将在语句顶部声明的变量。

数据库字段中的字符串示例如下:

,"FIELD1","FIELD2","FIELD3",FIELD4,FIELD5,FIELD6,,,,"FIELD10",FIELD11,FIELD12,FIELD13

如您所见,此示例中的字段 7-9 为空白,因此它们在字符串中为空白。

我只需要一种方法来选择性地选择我需要使用逗号作为标记的字段。该字符串始终以逗号开头,因此 field1 始终位于第一个逗号之后。

我希望这是有道理的!

【问题讨论】:

  • 将您的数据库模式标准化为至少 1NF,您一开始就不会遇到这个问题! (该建议是一个长期解决方案,可能不会立即对您有用。)

标签: sql-server


【解决方案1】:

试试这个:

DECLARE @STRING VARCHAR(255) = ',"FIELD1","FIELD2","FIELD3",FIELD4,FIELD5,FIELD6,,,,"FIELD10",FIELD11,FIELD12,FIELD13'

DECLARE @FieldToReturn INT = 12 -- Pick which field you want

SET @STRING = RIGHT(@STRING, LEN(@STRING) - 1) + ',' -- Strip leading comma & add comma to the end
WHILE @FieldToReturn > 1 
   BEGIN
     SET @STRING = SUBSTRING(@STRING,PATINDEX('%,%',@STRING), LEN(@STRING)) 
     SET @FieldToReturn = @FieldToReturn - 1
     SET @STRING = RIGHT(@STRING, LEN(@STRING) - 1)
   END

SELECT SUBSTRING(@STRING,0,PATINDEX('%,%', @STRING))

如果该字段未填充,则返回空白。

编辑:我知道我可以将所有字符串操作放在 WHILE 内的一行中,但为了便于阅读,我选择不这样做...这个例子

【讨论】:

  • 完美,它省略了最后一个字段,因为它后面没有逗号,但是当我设置 @STRING 变量时,我只是在字段名称的末尾连接了一个逗号,它作品。非常感谢
  • 没问题!很好理解!我编辑了我的答案,只是在去掉前导逗号的同一行中添加了一个逗号。
猜你喜欢
  • 2014-06-13
  • 2021-08-07
  • 2016-08-20
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多