SQL大于子字符串

时间:2011-03-04 03:10:40

标签: sql select

我有一个像这样的SQL字段:

          ROOMS
=======================
bedrooms 2, bathrooms 2
bedrooms 3, bathrooms 2
bedrooms 6, bathrooms 1
bedrooms 1, bathrooms 4
bedrooms 1, bathrooms 2
bedrooms 4, bathrooms 4
bedrooms 1, bathrooms 3

如何构建单个SELECT语句来检索卧室大于3的所有行?

此外,是否可以对此语句进行变异以检索浴室大于3的所有行?

修改

是的,是的,是的,可怕的数据系统。 :)

然而,从概念上讲,有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

首先,我希望我不必指出这是一个多么糟糕,可怕的数据模型。

解决这个问题:

您只需解析字段中的数据即可。如果格式总是如上所述,您可能会使用substr,例如:

SELECT * FROM table WHERE SUBSTR(BEDROOMS, 9,1)>3

(不保证数字:-))。

如果格式更灵活(例如,超过9个床位/浴室,首先给出浴室),您可能需要使用正则表达式进行解析。大多数DBMS支持正则表达式,例如http://www.postgresql.org/docs/8.3/static/functions-matching.html

答案 1 :(得分:2)

嗯,这就是为什么规范化是'发明'的,所以你最终不会得到像这样糟糕的模式。无论如何设计这个应该是......,无论如何。

我建议首先修复架构,然后这不会有问题,但是要回答你的问题,你可以用“”替换所有“卧室”的出现,然后替换“的所有出现”,浴室“说”“ - 然后从那里形成一个查询。

SELECT CONVERT(int, SUBSTRING(ButcheredColumn, CHARINDEX('-', ButcheredColumn))) AS NumBedrooms
, CONVERT(int, RIGHT(ButcheredColumn, CHARINDEX('-', ButcheredColumn))) AS NumBathrooms
FROM (
    SELECT REPLACE(REPLACE(ROOMS, 'bedrooms ',''), ', bathrooms ', '-') AS ButcheredColumn
    FROM CrappyDesignedTable1
) AS ButhceredTable

可能需要使用charindex来获得正确的列,然后您可以将此表用作子查询并从中进行选择。我建议如果你不知道子查询是什么,把你所有的工具放下来,然后在你的iPhone上玩愤怒的冒险。

答案 2 :(得分:-2)

让您的设置如此

房间桌

room id     bedrooms      bathrooms
  1            2             2
  2            3             2
  3            3             1
  4            1             1
  5            2             3

那么您需要做的就是:

SELECT * FROM rooms WHERE卧室> 3