プロパティ管理システムでは、好みに基づいて購入者を保存しています。ある人が 2 以上 4 未満の家に興味があるとしましょう。添付ファイルをご覧ください。
検索するとき、2軒以上の家に興味のある買い手を探している人がいるとします。
2 つ以上のバスルームがある家に興味を持っているバイヤーを誰かが検索した場合。selectステートメントは何ですか?
プロパティ管理システムでは、好みに基づいて購入者を保存しています。ある人が 2 以上 4 未満の家に興味があるとしましょう。添付ファイルをご覧ください。
検索するとき、2軒以上の家に興味のある買い手を探している人がいるとします。
2 つ以上のバスルームがある家に興味を持っているバイヤーを誰かが検索した場合。selectステートメントは何ですか?
<=
最小値と最大値を格納してから、 andでクエリを実行する方が理にかなっていません>=
か?
最小/最大のテーブル構造の方がはるかに優れていると思いますが、変更できない場合は、これを試してください。
まず、いくつかの基本ルールを考えてみましょう。これらのいずれかに違反している場合、最終的な回答を変更する必要があります (おそらくより複雑になります)。
+
どこかに含まれている場合、最大値は無限です。+
文字列の最後にのみ発生します。もしそれらがすべて本当なら、たくさんの作業を経て、私はあなたが使えるものを手に入れたと思います. 基本的なアイデアは、文字列から最小/最大値を取得する関数のペアを考え出すことでした。これらの関数を取得したら、それらを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」に関するエラーが発生しましたELSE
。CASE
構文が機能します。)
これらがあれば、次のようなクエリを実行できます。
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
+
ここでのパフォーマンス特性についてはわかりません。私は彼らが素晴らしいとは思いません。検索するデータが大量にある場合は、関数ベースのインデックス作成を検討することをお勧めします。
幸運を。お役に立てれば。
テーブルのデザインが最適ではありません。ベッドルームの数を整数として単純に格納できます。その場合、「1,2,3,4」の代わりに 4 だけが表示されます。
ただし、特定の質問に答えるには、置換トリックを実行して、列内のコンマの数を数えることができます。
SELECT * FROM myTable WHERE LEN(col) - LEN(REPLACE(col, ',','')) >= someNumber