2016-04-06 25 views
-1

SQL Server 2008の列にカンマ区切りの値が含まれているエントリを選択するSQL文を書く方法がわかります(通常、カンマ)):コンマ区切りの列から値を見つける方法

Column1 
--------------------------- 
10-15,20-30,31-97,104-187 

この列の値は、コンマで区切られた範囲を表します。 この場合、私は25を探しています。

+0

上記の例には25がありません – TheGameiswar

+0

実際に値20-30を意味します(20から30までのすべての値が存在します)。申し訳ありませんが、適切な質問はできません。見つけることは可能ですか?例: 私は2つのテーブルTable1(Column1、Cloumn2)とTable2を持っています。これらのデータ10-15,20-30,31-97,104-187 は、Table1から来ており、カンマ区切りでTable2に座っています。 –

答えて

1

データベースの正規化を検討してください。単一の列を使用して複数の範囲のデータを保持することによって、傷害に侮辱を加えています。正規化されたデータベースには、開始値と終了値、および元のテーブルへの外部キーを含む範囲の別のテーブルがあります。このような
何か:

CREATE TABLE tblRange 
(
    Range_itemId int, --(fk to the original table) 
    Range_From int, 
    Range_To int 
) 

あなたがこれを行う必要があり、あなたのクエリは、単に次のようになります。しかし

SELECT i.* 
FROM tblItems 
INNER JOIN tblRange ON(Item_Id = Range_ItemId) 
WHERE Range_From <= 25 
AND Range_To >= 25 

、あなたのデータベースを正規化することができないならば、あなたはsplit string機能を使用する必要がありますコンマで区切られた列から行を作成し、各行のテキストを解析して各行の範囲を調べます。ここ
は一例であり:

CREATE TABLE ZZZItems 
(
    ItemId int identity(1,1), 
    ItemRanges varchar(500) 
) 

デモテーブルを作成移入デモテーブル

INSERT INTO ZZZItems VALUES 
('10 - 20, 20 - 30, 30 - 40'), 
('40 - 50, 50 - 60, 60 - 70'), 
('70 - 80, 80 - 90, 90 - 100'), 
('10 - 20, 20 - 30, 30 - 40') 

分割関数テーブルへCROSS APPLYを使用して分割さデータ

;WITH CTE AS 
    (
     SELECT ItemId, 
       CAST(LEFT(Data, CHARINDEX('-', Data) - 1) As Int) As RangeFrom, 
       CAST(RIGHT(Data, LEN(Data) - CHARINDEX('-', Data)) As Int) As RangeTo 
     FROM ZZZItems 
     CROSS APPLY dbo.Split(ItemRanges, ',') 
    ) 

    -- select the item ids where the requested number fits in the range. 
    SELECT ItemId 
    FROM CTE 
    WHERE RangeFrom < 25 
    AND RangeTo > 25 
の範囲を抽出します

cl

DROP TABLE ZZZItems 

結果アップEAN:

ItemId 
----------- 
1 
4 

私はあなたが私がリンクした記事から自分を選択する必要があり、スプリット機能を追加しませんでした。

+0

ありがとうございました.....感謝しています............. Zohar –

+0

[喜んでください: - )](http://meta.stackoverflow.com/questions/291325/how- to-a-on-a-user-on-stackoverflow/291327#291327) –

関連する問題