0

私は以下の形式のようなテーブルを持っています、そして条件は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値を取得したいので、一致する境界に従ってテーブル条件列を確認する必要があります。

このクエリを手伝っていただけませんか。

4

3 に答える 3

3

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)
于 2013-01-10T12:58:35.687 に答える
2

テーブルの構造に力がある場合は、これを(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

テーブルの構造が石で設定されている場合は、質問でそれを言及するよりも。

于 2013-01-10T12:50:13.090 に答える
0

そのテーブルを再構築してSWekosコードを使用したいが、質問に直接答えるには:

あなたが説明した通りである場合、 HELLUVA DIRTY HACKで利用できる年齢と範囲IDの間に関係があります:

select 
    CASE p.age
      WHEN  p.age < 70 THEN p.age %10 + 1
      ELSE 6
FROM People as p

;)

于 2013-01-10T12:56:25.207 に答える