在列t-sql中搜索逗号分隔的字符串

时间:2013-08-07 05:29:45

标签: sql-server-2008 tsql

在物业管理系统中,我根据他们的偏好保存买家。说一个对超过2& 2的房子感兴趣的人小于4.所以我把它保存为2,3,4。请参阅附件。

搜索时,如果有人搜索对超过2的房屋感兴趣的买家,我该如何编写选择语句来检查卧室栏目。

如果有人搜索对有超过2间浴室的房屋感兴趣的买家;什么可能是选择声明?

enter image description here

3 个答案:

答案 0 :(得分:1)

存储最小值和最大值然后使用<=>=进行查询会不会更有意义吗?

答案 1 :(得分:1)

我仍然认为min / max是更好的表结构,但如果你不能改变它,试试这个。

首先,让我们提出一些基本规则。如果违反了其中任何一项,那么最终答案将需要修改(并且可能会更复杂)。

  1. 如果字符串中包含+,则最大值为无穷大。
  2. +只能出现在字符串的末尾。
  3. 列表将始终以逗号分隔整数。
  4. 最小的数字将始终位于列表的第一位。
  5. 最大的数字将始终位于列表的最后。
  6. 如果所有这些都是真的,那么经过大量的工作后,我想我有一些你可以使用的东西。基本的想法是提出一对函数来获取字符串中的最小值/最大值。完成这些功能后,您可以在WHERE子句中使用它们。

    初学者请参阅此SQL Fiddle。左侧的函数定义,一个示例查询,为您提供有关它们如何在右侧工作的要点。

    CREATE FUNCTION dbo.list_min(@list_str AS VARCHAR(MAX))
      RETURNS INT
      WITH RETURNS NULL ON NULL INPUT
      AS BEGIN
        DECLARE @comma_index INT;
        SET @comma_index = CHARINDEX(',', @list_str);
        DECLARE @result INT;
        IF (0 < @comma_index)
          SET @result = CONVERT(INT, LEFT(@list_str, @comma_index - 1));
        ELSE
          SET @result = CONVERT(INT, REPLACE(@list_str, '+', ''));
        RETURN @result;
      END;
    

    CREATE FUNCTION dbo.list_max(@list_str AS VARCHAR(MAX))
      RETURNS INT
      WITH RETURNS NULL ON NULL INPUT
      AS BEGIN
        IF (@list_str LIKE '%+')
          RETURN 2147483647; -- Max INT
        DECLARE @comma_index INT;
        SET @comma_index = CHARINDEX(',', REVERSE(@list_str));
        DECLARE @result INT;
        IF (0 < @comma_index)
          SET @result = CONVERT(INT, RIGHT(@list_str, @comma_index - 1));
        ELSE
          SET @result = CONVERT(INT, @list_str);
        RETURN @result;
      END;
    

    (如果有人能想出办法摆脱那个荒谬的result变量,让我知道。我收到的错误是关于最后一句话“必须是一个回复声明“将回报放在IF / ELSE内时,我无法使用CASE语法。)

    有了这些,您可以执行以下查询:

    SELECT *
    FROM stuff
    WHERE dbo.list_min(carspace) <= 2 AND 2 <= dbo.list_max(carspace)
    

    只会选择你的第二行。 (此SQL Fiddle此查询。)

    您可能会发现有用的第三个功能是在列表中为您提供最大值而忽略+的功能。为此,它本质上是list_max函数,但没有检查IF的{​​{1}}块。获取该功能后,您可能只想从+删除+支票,并创建另一个检查list_max的功能,如果没有{{1}则调用+ }}

    我不确定这里的性能特征。我想他们并不好。如果要搜索大量数据,您可能需要考虑一些基于函数的索引。

    祝你好运。希望这会有所帮助。

答案 2 :(得分:0)

您的桌面设计不是最佳选择。您可以简单地将卧室数量存储为整数。而不是“1,2,3,4”,在这种情况下你只会看到4个。

要回答这个问题,您可以使用替换技巧来计算列中逗号的数量:

SELECT * FROM myTable WHERE LEN(col) - LEN(REPLACE(col, ',','')) >= someNumber