求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?

时间:2022-06-08 14:56:11
一直没有怎么专门的学习SQL,对其也只是一般性的了解!

最近工作需要,有一个关于数据库查询的问题,求高手解决:
有一个字典表,是一个分类表,大致内容如下:
ClassTbl:
ID    Name
001   分类1
002   分类2
003   分类3
004   分类4
005   分类5
…      …
ProductTbl:
ID    Name    ClassID
001   产品1    002,003
002   产品2    001,003,004
003   产品3    003
004   产品4    002,003,004
005   产品5    001,002,003,004,005
…      …        …

现在希望查询出来的结果是将ProductTbl表中的ClassID替换成名称,即:
产品1    分类2,分类3
产品2    分类1,分类3,分类4
产品3    分类3
产品4    分类2,分类3,分类4
产品5    分类1,分类2,分类3,分类4,分类5
…        …

在baidu和google中都不知道怎么搜索,所以到这里来请教,请不吝赐教!

6 个解决方案

#1


replace

#2


replace,如何replace?

#3


用函数吧
CREATE  FUNCTION GetClassName(@ClassID VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @ClassName NVARCHAR(MAX)
SELECT @ClassName = ''

WHILE @ClassID <> ''
   BEGIN
    DECLARE @Position INT
    SELECT @Position = CHARINDEX(',',@ClassID)
   
    IF @Position > 0
      BEGIN
       SELECT @ClassName = @ClassName + NAME + ',' FROM classtbl WHERE ID = SUBSTRING(@ClassID,1,@Position - 1);
       SET @ClassID = SUBSTRING(@ClassID,@Position + 1 ,LEN(@ClassID)-@Position + 1);
      END
     ELSE
      BEGIN
      SELECT @ClassName = @ClassName + NAME FROM classtbl WHERE ID = @ClassID
      SET @ClassID = ''
      END
   
   END
   
RETURN @ClassName
END

SELECT ID,NAME,dbo.GetClassName(ClassID) from ProductTbl

#4


select Nam,class=stuff((select ','+[Nam] from tb1 where class like '%'+ tb1.ID +'%' for xml path('')),1,1,'') from tb2

#5


引用 4 楼 xxfvba 的回复:
select Nam,class=stuff((select ','+[Nam] from tb1 where class like '%'+ tb1.ID +'%' for xml path('')),1,1,'') from tb2


该语句有问题,但是提供了一种思路,谢谢!

#6


引用 3 楼 wangchangming 的回复:
用函数吧
CREATE  FUNCTION GetClassName(@ClassID VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @ClassName NVARCHAR(MAX)
SELECT @ClassName = ''

WHILE @ClassID <> ''
   BEGIN
    DECLARE @Position INT
    SELECT @Position = CHARINDEX(',',@ClassID)
   
    IF @Position > 0
      BEGIN
       SELECT @ClassName = @ClassName + NAME + ',' FROM classtbl WHERE ID = SUBSTRING(@ClassID,1,@Position - 1);
       SET @ClassID = SUBSTRING(@ClassID,@Position + 1 ,LEN(@ClassID)-@Position + 1);
      END
     ELSE
      BEGIN
      SELECT @ClassName = @ClassName + NAME FROM classtbl WHERE ID = @ClassID
      SET @ClassID = ''
      END
   
   END
   
RETURN @ClassName
END

SELECT ID,NAME,dbo.GetClassName(ClassID) from ProductTbl


这个很好,解决了我的问题!

#1


replace

#2


replace,如何replace?

#3


用函数吧
CREATE  FUNCTION GetClassName(@ClassID VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @ClassName NVARCHAR(MAX)
SELECT @ClassName = ''

WHILE @ClassID <> ''
   BEGIN
    DECLARE @Position INT
    SELECT @Position = CHARINDEX(',',@ClassID)
   
    IF @Position > 0
      BEGIN
       SELECT @ClassName = @ClassName + NAME + ',' FROM classtbl WHERE ID = SUBSTRING(@ClassID,1,@Position - 1);
       SET @ClassID = SUBSTRING(@ClassID,@Position + 1 ,LEN(@ClassID)-@Position + 1);
      END
     ELSE
      BEGIN
      SELECT @ClassName = @ClassName + NAME FROM classtbl WHERE ID = @ClassID
      SET @ClassID = ''
      END
   
   END
   
RETURN @ClassName
END

SELECT ID,NAME,dbo.GetClassName(ClassID) from ProductTbl

#4


select Nam,class=stuff((select ','+[Nam] from tb1 where class like '%'+ tb1.ID +'%' for xml path('')),1,1,'') from tb2

#5


引用 4 楼 xxfvba 的回复:
select Nam,class=stuff((select ','+[Nam] from tb1 where class like '%'+ tb1.ID +'%' for xml path('')),1,1,'') from tb2


该语句有问题,但是提供了一种思路,谢谢!

#6


引用 3 楼 wangchangming 的回复:
用函数吧
CREATE  FUNCTION GetClassName(@ClassID VARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @ClassName NVARCHAR(MAX)
SELECT @ClassName = ''

WHILE @ClassID <> ''
   BEGIN
    DECLARE @Position INT
    SELECT @Position = CHARINDEX(',',@ClassID)
   
    IF @Position > 0
      BEGIN
       SELECT @ClassName = @ClassName + NAME + ',' FROM classtbl WHERE ID = SUBSTRING(@ClassID,1,@Position - 1);
       SET @ClassID = SUBSTRING(@ClassID,@Position + 1 ,LEN(@ClassID)-@Position + 1);
      END
     ELSE
      BEGIN
      SELECT @ClassName = @ClassName + NAME FROM classtbl WHERE ID = @ClassID
      SET @ClassID = ''
      END
   
   END
   
RETURN @ClassName
END

SELECT ID,NAME,dbo.GetClassName(ClassID) from ProductTbl


这个很好,解决了我的问题!