在物业管理系统中,我根据他们的偏好保存买家。说一个对超过2& 2的房子感兴趣的人小于4.所以我把它保存为2,3,4。请参阅附件。
搜索时,如果有人搜索对超过2的房屋感兴趣的买家,我该如何编写选择语句来检查卧室栏目。
如果有人搜索对有超过2间浴室的房屋感兴趣的买家;什么可能是选择声明?
答案 0 :(得分:1)
存储最小值和最大值然后使用<=
和>=
进行查询会不会更有意义吗?
答案 1 :(得分:1)
我仍然认为min / max是更好的表结构,但如果你不能改变它,试试这个。
首先,让我们提出一些基本规则。如果违反了其中任何一项,那么最终答案将需要修改(并且可能会更复杂)。
+
,则最大值为无穷大。+
只能出现在字符串的末尾。如果所有这些都是真的,那么经过大量的工作后,我想我有一些你可以使用的东西。基本的想法是提出一对函数来获取字符串中的最小值/最大值。完成这些功能后,您可以在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