我有一个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
答案 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子句中应用过滤器。
感谢大家帮我解决这个问题。