SQL:在Alpha上过滤,在TEXT类型的列上过滤数字

时间:2014-11-24 20:56:01

标签: sql-server alphanumeric

我有一个Text类型的列。在列中是数字值,例如4, 8, 3.2, etc..。以及'Negative', 'Positive', '27A', '2pos 1neg'.

等值

用户需要能够说:"给我10到30之间的所有值,以及“否定”的值。 WHERE子句需要按照以下方式执行:

WHERE Tbl.Col > 10
AND   Tbl.Col < 30
AND   Tbl.Col = 'Negative'

由于显而易见的原因,这是有问题的。我尝试过使用ISNUMERIC功能来缓解这个问题,但似乎无法完全满足我的需求。我可以获取列中的所有alpha值,或列中的所有数值作为浮点数,但似乎无法同时过滤两者。要获取我使用过的所有数字值:

SELECT Num.Val FROM 
    (SELECT Val = CASE ISNUMERIC(CAST(TBL.COL AS VARCHAR)) WHEN 1 
             THEN CAST(CAST(TBL.COL AS VARCHAR) AS FLOAT) ELSE NULL END
            FROM Table TBL
            WHERE TBL.COL IS NOT NULL ) as Num
    WHERE Num.val IS NOT NULL
    AND   Num.val > 10

3 个答案:

答案 0 :(得分:1)

如果我理解这个问题,那么这样的事情会让你接近。

with MyNumbers as
(
    select t.Col
    from Tbl t
    --where ISNUMERIC(t.Col) = 1
    where t.Col NOT LIKE '%[^0-9.]%'
)
, MyAlpha as
(
    select t.Col
    from Tbl t
    where ISNUMERIC(t.Col) = 0
)

select Col
from MyNumbers
where Col > 10
    and Col < 30

union all

select Col
from MyAlpha
where ColorMatch = ' Negative'

答案 1 :(得分:0)

首先,我会打电话给设计桌子的人(希望不是你):&gt;

转到here并获取拆分表功能。然后我将文本列(如上例中所示)转换为varchar(max)并将其作为参数提供给split函数。然后,您可以使用用户提供的参数从分割函数的表结果中进行选择。

答案 2 :(得分:0)

我找到了问题的答案:

SELECT
al_Value   =    Table.Column
FROM Table
WHERE ( 
        ISNUMERIC(CAST(Table.Column AS VARCHAR)) = 1 AND 
        CONVERT(FLOAT, CAST(Table.Column AS VARCHAR)) > 1.0 AND 
        CONVERT(FLOAT, CAST(Table.Column AS VARCHAR)) < 10.0
      )    
OR    ( 
        CAST(Table.Column AS VARCHAR) IN ('negative', 'no bueno') 
      )

这将返回一个名为'al_Value'的列,它在Table.Column(数据类型为TEXT)上进行过滤,并在上面的WHERE子句中应用过滤器。

感谢大家帮我解决这个问题。