从表中选择*,其中column =(逗号分隔字符串中的任何值)

时间:2013-07-08 09:42:14

标签: sql sql-server

用户从下拉列表中选择各种单词,并将这些值添加到逗号分隔的字符串中。将字符串传递给存储过程时,我希望它select * from存在该单词的表。

id----word

1-----cat

2-----dog

3-----mouse

4-----dog

传递给存储过程的字符串是cat, dog,因此返回第1,2和4列。

有没有办法在sql server中执行此操作?

5 个答案:

答案 0 :(得分:4)

使用IN

SELECT *
FROM   your_table
WHERE  word IN ('cat', 'dog')

答案 1 :(得分:2)

首先需要创建一个SplitCSV函数:

CREATE FUNCTION [dbo].[SplitCSV] (@CSVString VARCHAR(8000), @Delimiter CHAR(1))
RETURNS @temptable TABLE (items VARCHAR(8000))
AS
BEGIN
    DECLARE @pos INT;
    DECLARE @slice VARCHAR(8000);

    SELECT @pos = 1;
    IF LEN(@CSVString) < 1 OR @CSVString IS NULL RETURN;

    WHILE @pos!= 0
    BEGIN
        SET @pos = CHARINDEX(@Delimiter,@CSVString);
        IF @pos != 0
            SET @slice = LEFT(@CSVString, @pos - 1);
        ELSE
            SET @slice = @CSVString;

        IF( LEN(@slice) > 0)
            INSERT INTO @temptable(Items) VALUES (@slice);

        SET @CSVString = RIGHT(@CSVString, LEN(@CSVString) - @pos);
        IF LEN(@CSVString) = 0 BREAK;
    END
    RETURN
END
GO

然后你就可以使用它:

SELECT *
FROM myTable
WHERE ID IN (
    SELECT items FROM [dbo].[SplitCSV]('1,2,3,4,5', ',')
)

答案 2 :(得分:1)

SELECT *
FROM Table
WHERE '%,' + Word + ',%' LIKE ',' + @your_csv_param + ','

参数和列的开头和结尾处的额外逗号用于阻止搜索将catcatfish匹配。

答案 3 :(得分:0)

如果要选择除鼠标以外的所有动物,可以使用NOT IN

SELECT * FROM
TABLE
WHERE Word Not IN('Mouse')

所以你可以避免输入许多类型的动物

答案 4 :(得分:0)

CREATE FUNCTION 
ALTER  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(    
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)   
)
AS

BEGIN

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
  BEGIN  
    SET @index = CHARINDEX(@delimiter , @text)  
    IF (@index = 0) AND (LEN(@text) > 0)  
      BEGIN   
        INSERT INTO @Strings VALUES (@text)
          BREAK  
      END  

    IF (@index > 1)  
      BEGIN   
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))   
        SET @text = RIGHT(@text, (LEN(@text) - @index))  
      END  
    ELSE 
      SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END

  RETURN

END

----

select * from yourtable where column in ( select value from fn_Split(@para1,',')