Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在t-sql列中搜索逗号分隔的字符串_Sql Server 2008_Tsql - Fatal编程技术网

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

Sql server 2008 在t-sql列中搜索逗号分隔的字符串,sql-server-2008,tsql,Sql Server 2008,Tsql,在房地产管理系统中,我根据买家的偏好为他们节省开支。比如说,一个人对2栋以上、4栋以下的房子感兴趣。所以我把它保存为2,3,4。请看附件 当搜索时,比如有人搜索对超过2套房子感兴趣的买家,我应该如何写select语句来检查卧室栏 如果有人搜索对有2个以上浴室的房子感兴趣的买家;select语句可能是什么 存储一个最小值和最大值,然后用=查询是否更有意义?您的表设计不是最优的。您可以简单地将卧室数存储为整数。而不是“1,2,3,4”,在这种情况下,您将只看到4 但要回答特定问题,您可以使用替换技巧

在房地产管理系统中,我根据买家的偏好为他们节省开支。比如说,一个人对2栋以上、4栋以下的房子感兴趣。所以我把它保存为2,3,4。请看附件

当搜索时,比如有人搜索对超过2套房子感兴趣的买家,我应该如何写select语句来检查卧室栏

如果有人搜索对有2个以上浴室的房子感兴趣的买家;select语句可能是什么


存储一个最小值和最大值,然后用
=
查询是否更有意义?

您的表设计不是最优的。您可以简单地将卧室数存储为整数。而不是“1,2,3,4”,在这种情况下,您将只看到4

但要回答特定问题,您可以使用替换技巧来计算列中的逗号数,如下所示:


SELECT*FROM myTable,其中LEN(col)-LEN(REPLACE(col,,,,”)>=someNumber

我仍然认为min/max是更好的表结构,但如果您无法更改,请尝试此方法

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

  • 如果字符串中的任何位置包含
    +
    ,则最大值为无穷大
  • +
    只能出现在字符串的末尾
  • 列表将始终是逗号分隔的整数
  • 最小的数字将始终位于列表的第一位
  • 最大的数字将始终是列表中的最后一个
  • 如果所有这些都是真的,那么经过大量的工作,我想我有一些你可以使用的东西。其基本思想是提出一对函数,用于从字符串中获取最小/最大值。一旦有了这些函数,就可以在
    WHERE
    子句中使用它们

    首先看看这个。左边是函数定义,右边是一个示例查询,为您提供它们如何工作的要点

    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;
    
    这将只选择您的第二行。(本查询的内容)

    您可能会发现第三个有用的函数是,它为您提供列表中的最大值,但忽略
    +
    。要做到这一点,基本上是
    list\u max
    函数,但没有检查
    +
    IF
    块。要获得该功能,您可能只需要从
    列表\u max
    中删除
    +
    检查,然后创建另一个函数,检查
    +
    并在没有
    +
    的情况下调用
    列表\u max

    我不确定这里的性能特征。我想他们不是很好。如果您有大量的数据要搜索,您可能需要考虑一些基于函数的索引。
    祝你好运。希望这能有所帮助。

    您能再详细说明一下吗?。浴室/卧室字段中允许的格式是什么?你能用“-3”表示“小于3”吗。“1,2,3+”和“1+”有什么区别?如果是1,表示他只需要一个。如果是加上他可能会喜欢超过1是的,这是可能的。但问题是它以前是在表结构中完成的。如果我改变这一点,它将打破大多数地方:(@aruna现在重新做这件事可能比在王国到来之前与糟糕的设计抗争要好:-)这太棒了。谢谢你的努力。正如你提到的,这些规则已经存在。到目前为止,它工作得很好。你为我节省了很多时间……:)
    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;
    
    SELECT *
    FROM stuff
    WHERE dbo.list_min(carspace) <= 2 AND 2 <= dbo.list_max(carspace)