【问题标题】:SQL reading from a comma delimited field and then bringing data back in comma delimited formatSQL 从逗号分隔的字段中读取,然后以逗号分隔的格式返回数据
【发布时间】:2015-07-23 17:28:29
【问题描述】:

我在表格列中有字符串格式的数据3,2,1。我有查找表,告诉我与文件关联的文件名

表格是这样的

Id (int) name
------------------
  1      file 1
  2      file 2

我想要做的是发送字符串3,2,1 并将数据作为file 1, file 2 作为单独的列返回,以便我可以在显示时引用它。请注意,这将添加到现有的存储过程中,这就是为什么我只想要一个字符串行返回

提前感谢您的帮助

【问题讨论】:

  • 帮自己一个忙,不要在同一列中存储多个离散项目。它破坏了关系模型,是一种非常糟糕的做法。
  • 这是另一个很好的例子,说明在关系数据库列中保留分隔数据应该是非法的。
  • 谢谢队长。有时你会被别人的代码卡住,如果你不能贡献,请闭嘴并获得生命

标签: sql-server tsql comma delimited


【解决方案1】:

您可能想要编写一些这样的代码。下面的代码只是一个让你走上正轨的例子。如果您有任何问题,请告诉我

DECLARE @input VARCHAR(MAX)
DECLARE @index1 INT
DECLARE @index2 INT
DECLARE @Id VARCHAR(10)
DECLARE @str VARCHAR(MAX)
DECLARE @result VARCHAR(MAX)

SET @input = '3,2,1';
SET @str = REVERSE(@input)
SET @index1 = 1;
SET @index2 = CHARINDEX(',', @str)
SET @Id = SUBSTRING(@str, @index1, @index2 -@index1)

SET @result = 'File ' + @Id + ','

WHILE (@index2 > 0 )
BEGIN

    SET @str = SUBSTRING(@str, @index2 + 1, LEN(@str) -@index1)
    SET @Id = SUBSTRING(@str,@index1,@index2 -@index1) 
    SET @index1 = @index2
    SET @index2 = CHARINDEX(',', @str)
    IF LEN(@Id) > 0
        SET @result = @result + 'File ' + @Id + ','
END

SET @Id = @str;
SET @result =  @result + 'File ' + @Id

SELECT @result

【讨论】:

  • 谢谢你,我会试试的,但问题是你提到的这个 @input 变量来自一个不同的数据库表字段,以便我可以在我的输出字段中使用它。希望我让事情变得比他们更清楚,但感谢您抽出时间来帮助我
  • 可以从数据库表中获取输入变量 将 >SET input ='3,2,1' 行替换为 >SET input = (SELECT TargetField FROM TargetDb.TargetTable)
【解决方案2】:

另一个例子:

-- Create ID String, only used for example
DECLARE @IDString varchar(max)
set @IDString = '1,2,3,4'

-- Create lookup table, only used for example
CREATE TABLE #lookup (id int, val varchar(50))
INSERT INTO #lookup(id, val) VALUES (1, 'first lookup') 
INSERT INTO #lookup(id, val) VALUES (2, 'second lookup') 
INSERT INTO #lookup(id, val) VALUES (3, 'third lookup') 
INSERT INTO #lookup(id, val) VALUES (4, 'fourth lookup') 

-- Convert ID String to individual IDs        
DECLARE @Xml xml
SELECT @Xml = CONVERT(xml,' <root><id>' + REPLACE(@IDString,',','</id><id>') + '</id></root>')

-- Join IDs to lookup table and return string
SELECT SUBSTRING(
(SELECT ',' + Val as [text()]
FROM (SELECT ID = Tab.rec.value('.','varchar(20)') FROM @Xml.nodes('/root/id') Tab(rec)) ids
JOIN #lookup ON ids.ID = #lookup.id
FOR XML PATH('')),2,1000) AS valuestring

--Cleanup, only used for example
DROP TABLE #lookup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多