私は以下の形式のようなテーブルを持っています、そして条件はnvarchar形式の値の間の年齢です
Id Condition
1 0 to 10
2 10 to 20
3 20 to 30
4 30 to 40
5 40 to 50
6 50 Above
ここで、実行時にID値を取得したいので、一致する境界に従ってテーブル条件列を確認する必要があります。
このクエリを手伝っていただけませんか。
私は以下の形式のようなテーブルを持っています、そして条件はnvarchar形式の値の間の年齢です
Id Condition
1 0 to 10
2 10 to 20
3 20 to 30
4 30 to 40
5 40 to 50
6 50 Above
ここで、実行時にID値を取得したいので、一致する境界に従ってテーブル条件列を確認する必要があります。
このクエリを手伝っていただけませんか。
SWekoに同意します。タイプを変更できない場合は、単純な線形回帰があるのは幸運なことのように思われるので、これも機能します。注意:これは最適ではないソリューションです
DECLARE @InputAge TINYINT = 31
;WITH MyTable (Id, Condition) AS
(
-- Corrected age overlaps
SELECT 1, '0 to 10' UNION ALL
SELECT 2, '11 to 20' UNION ALL
SELECT 3, '21 to 30' UNION ALL
SELECT 4, '31 to 40' UNION ALL
SELECT 5, '41 to 50' UNION ALL
SELECT 6, '51 Above'
)
SELECT Id
FROM MyTable
WHERE @InputAge BETWEEN 10 * Id-9
AND CASE WHEN Id = 6 THEN 150 ELSE 10*Id END
文字列操作は次のようになります。これも非常にパフォーマンスが悪いです!
DECLARE @InputAge TINYINT = 35
;WITH MyTable (Id, Condition) AS
(
-- Corrected age overlaps
SELECT 1, '0 to 10' UNION ALL
SELECT 2, '11 to 20' UNION ALL
SELECT 3, '21 to 30' UNION ALL
SELECT 4, '31 to 40' UNION ALL
SELECT 5, '41 to 50' UNION ALL
SELECT 6, '51 Above'
)
SELECT Id
,LEFT(Condition, CHARINDEX(' ', Condition))
,RIGHT(Condition, CHARINDEX(' ', REVERSE(Condition)))
FROM MyTable
WHERE @InputAge BETWEEN LEFT(Condition, CHARINDEX(' ', Condition)) AND ISNULL(NULLIF(RIGHT(Condition, CHARINDEX(' ', REVERSE(Condition))), 'Above'), 255)
テーブルの構造に力がある場合は、これを(ID, MaxAge, MinAge)
形式に変更すると、クエリは次のようになります。
select p.*, r.ID as AgeBracket
from people p
inner join ageRestrictions r
on p.Age between r.MinAge and r.MaxAge
テーブルの構造が石で設定されている場合は、質問でそれを言及するよりも。
そのテーブルを再構築してSWekosコードを使用したいが、質問に直接答えるには:
あなたが説明した通りである場合、 HELLUVA DIRTY HACKで利用できる年齢と範囲IDの間に関係があります:
select
CASE p.age
WHEN p.age < 70 THEN p.age %10 + 1
ELSE 6
FROM People as p
;)