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