-1

プロパティ管理システムでは、好みに基づいて購入者を保存しています。ある人が 2 以上 4 未満の家に興味があるとしましょう。添付ファイルをご覧ください。

検索するとき、2軒以上の家に興味のある買い手を探している人がいるとします。

2 つ以上のバスルームがある家に興味を持っているバイヤーを誰かが検索した場合。selectステートメントは何ですか?

ここに画像の説明を入力

4

3 に答える 3

1

<=最小値と最大値を格納してから、 andでクエリを実行する方が理にかなっていません>=か?

于 2013-08-07T05:37:09.587 に答える
1

最小/最大のテーブル構造の方がはるかに優れていると思いますが、変更できない場合は、これを試してください。

まず、いくつかの基本ルールを考えてみましょう。これらのいずれかに違反している場合、最終的な回答を変更する必要があります (おそらくより複雑になります)。

  1. 文字列の+どこかに含まれている場合、最大値は無限です。
  2. +文字列の最後にのみ発生します。
  3. リストは常にカンマ区切りの整数です。
  4. 最小の番号が常にリストの最初になります。
  5. 最大数は常にリストの最後になります。

もしそれらがすべて本当なら、たくさんの作業を経て、私はあなたが使えるものを手に入れたと思います. 基本的なアイデアは、文字列から最小/最大値を取得する関数のペアを考え出すことでした。これらの関数を取得したら、それらを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。 /内に return を入れるときに、最後のステートメント「must be a return statement」に関するエラーが発生しましたELSECASE構文が機能します。)

これらがあれば、次のようなクエリを実行できます。

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

これにより、2行目のみが選択されます。(このクエリのSQL Fiddle 。)

役に立つと思われる 3 番目の関数は、リスト内の最大値を提供しますが、+. それを行うには、本質的にlist_max関数ですが、IFをチェックするブロックはありません+。その機能を取得するには、+からチェックを削除し、がない場合にチェックして呼び出すlist_max別の関数を作成することをお勧めします。+list_max+

ここでのパフォーマンス特性についてはわかりません。私は彼らが素晴らしいとは思いません。検索するデータが大量にある場合は、関数ベースのインデックス作成を検討することをお勧めします。

幸運を。お役に立てれば。

于 2013-08-08T09:01:33.500 に答える
0

テーブルのデザインが最適ではありません。ベッドルームの数を整数として単純に格納できます。その場合、「1,2,3,4」の代わりに 4 だけが表示されます。

ただし、特定の質問に答えるには、置換トリックを実行して、列内のコンマの数を数えることができます。

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

于 2013-08-07T05:39:57.840 に答える