SQL,我把一窜ID存入一个字段,如何把这个字段作为一个IN的查询条件呢?求大神指点!!!!

时间:2021-06-22 02:54:53
如表a 有个字段 A,存的是表b的多个ID号如(1,2,3)
我想查询出a.bID in a.A该怎么实现呢?

7 个解决方案

#1



select * from 表A as a inner join 表B as b
on charindex(','+cast(b.id as varchar(20))+',',','+a.A+',')>0

#2


Select
        *
    From a
        Inner Join b On charindex(','+b.A'+',',','+a.A+',')>0

#3


Select
        *
    From a
        Inner Join b On charindex(','+b.A+',',','+a.A+',')>0

#4


但是我如果A字段存有很多个ID呢,十几个或几十个呢,比如(1,2,3,4...)一样能查吗?

#5


可以

#6


我会先写一个函数:

if exists (select 1
          from sysobjects
          where  id = object_id('FN_GetTable')
          and type in ('IF', 'FN', 'TF'))
   drop function FN_GetTable
go


CREATE FUNCTION FN_GetTable(@COMM_STRING VARCHAR(8000))
RETURNS @TAB TABLE
(
  ID VARCHAR(50)

WITH ENCRYPTION
AS 
BEGIN 
    /*
    将带逗号的字符串转换为行数据
    入参:1,2,3
    出参:可以查询的表
    */
    DECLARE @SPLITCOUNT INT, 
@I INT,
@VALUE_TEMP VARCHAR(50),
@VALUE_LIST_TEMP VARCHAR(8000),
@VALUESPLITINDEX INT

SET @I = 0

SET @VALUE_LIST_TEMP = LTRIM(RTRIM(@COMM_STRING))

IF LEN(@VALUE_LIST_TEMP) > 0
BEGIN

IF RIGHT(@VALUE_LIST_TEMP,1) <> ',' 
SET @VALUE_LIST_TEMP = @VALUE_LIST_TEMP + ',';

SET @SPLITCOUNT = LEN(@VALUE_LIST_TEMP) - LEN(REPLACE(@VALUE_LIST_TEMP,',','')) --分融符为','

WHILE (@I < @SPLITCOUNT)
BEGIN
SET @VALUESPLITINDEX = CHARINDEX(',',@VALUE_LIST_TEMP,0)
SET @VALUE_TEMP = SUBSTRING(@VALUE_LIST_TEMP,1,@VALUESPLITINDEX - 1)
IF LEN(LTRIM(RTRIM(@VALUE_TEMP))) > 0 
INSERT INTO @TAB(ID) VALUES(@VALUE_TEMP)

SET @VALUE_LIST_TEMP = RIGHT(@VALUE_LIST_TEMP,LEN(@VALUE_LIST_TEMP) - @VALUESPLITINDEX)

SET @I = @I + 1
END
END

    RETURN
END
go



再写查询语句:

SELECT *
FROM   TEST
WHERE  DISH_ID IN (SELECT *
                   FROM   DBO.FN_GETTABLE ('10000001,10000002,10000003' ))

#7


where  charindex(','+rtrim(b.bid)+',',','+a.A+',')>0

#1



select * from 表A as a inner join 表B as b
on charindex(','+cast(b.id as varchar(20))+',',','+a.A+',')>0

#2


Select
        *
    From a
        Inner Join b On charindex(','+b.A'+',',','+a.A+',')>0

#3


Select
        *
    From a
        Inner Join b On charindex(','+b.A+',',','+a.A+',')>0

#4


但是我如果A字段存有很多个ID呢,十几个或几十个呢,比如(1,2,3,4...)一样能查吗?

#5


可以

#6


我会先写一个函数:

if exists (select 1
          from sysobjects
          where  id = object_id('FN_GetTable')
          and type in ('IF', 'FN', 'TF'))
   drop function FN_GetTable
go


CREATE FUNCTION FN_GetTable(@COMM_STRING VARCHAR(8000))
RETURNS @TAB TABLE
(
  ID VARCHAR(50)

WITH ENCRYPTION
AS 
BEGIN 
    /*
    将带逗号的字符串转换为行数据
    入参:1,2,3
    出参:可以查询的表
    */
    DECLARE @SPLITCOUNT INT, 
@I INT,
@VALUE_TEMP VARCHAR(50),
@VALUE_LIST_TEMP VARCHAR(8000),
@VALUESPLITINDEX INT

SET @I = 0

SET @VALUE_LIST_TEMP = LTRIM(RTRIM(@COMM_STRING))

IF LEN(@VALUE_LIST_TEMP) > 0
BEGIN

IF RIGHT(@VALUE_LIST_TEMP,1) <> ',' 
SET @VALUE_LIST_TEMP = @VALUE_LIST_TEMP + ',';

SET @SPLITCOUNT = LEN(@VALUE_LIST_TEMP) - LEN(REPLACE(@VALUE_LIST_TEMP,',','')) --分融符为','

WHILE (@I < @SPLITCOUNT)
BEGIN
SET @VALUESPLITINDEX = CHARINDEX(',',@VALUE_LIST_TEMP,0)
SET @VALUE_TEMP = SUBSTRING(@VALUE_LIST_TEMP,1,@VALUESPLITINDEX - 1)
IF LEN(LTRIM(RTRIM(@VALUE_TEMP))) > 0 
INSERT INTO @TAB(ID) VALUES(@VALUE_TEMP)

SET @VALUE_LIST_TEMP = RIGHT(@VALUE_LIST_TEMP,LEN(@VALUE_LIST_TEMP) - @VALUESPLITINDEX)

SET @I = @I + 1
END
END

    RETURN
END
go



再写查询语句:

SELECT *
FROM   TEST
WHERE  DISH_ID IN (SELECT *
                   FROM   DBO.FN_GETTABLE ('10000001,10000002,10000003' ))

#7


where  charindex(','+rtrim(b.bid)+',',','+a.A+',')>0