您的数据在某些时候会出现一些严重的问题 - 在基于文本的字段中存储整数会产生各种即时转换问题。如果你不能清理它,我们需要变得有点棘手并做出一堆假设,例如任何 NULL 都会打败任何数值。
我将假设您有某种 ID 可以查询,然后我将构建一个小表用于演示:
CREATE TABLE mynvarcharstuff (ID INTEGER, LINE1_OPEN_LOOP_VOLTAGE nvarchar(50), LINE2_OPEN_LOOP_VOLTAGE nvarchar(50))
INSERT INTO mynvarcharstuff VALUES (1, '-49.15', '-8.68'), (2, '-49.15', NULL), (3, '-18', '7.65'), (4, '26.5', '4')
, (5, '49.15', NULL), (6, '25.3', '-12.4'), (7, NULL, NULL), (8, 'bob', '6.5'), (9, ' 33', '')
使用 CTE(或临时表,如果您愿意)根据这些 ID 随时解决动态转换问题:
WITH numeric_ids AS (
SELECT ID
, CASE WHEN (LINE1_OPEN_LOOP_VOLTAGE IS NULL OR LINE2_OPEN_LOOP_VOLTAGE IS NULL) THEN 1 ELSE 0 END AS CheckNull
, CASE WHEN ISNUMERIC(LINE1_OPEN_LOOP_VOLTAGE) = 1 THEN 1 ELSE 0 END AS CheckLine1
, CASE WHEN ISNUMERIC(LINE2_OPEN_LOOP_VOLTAGE) = 1 THEN 1 ELSE 0 END AS CheckLine2
FROM mynvarcharstuff
)
SELECT N.ID
, CASE
-- If you move this line below either of the numeric checks, you potentially get errors - be careful!
WHEN I.CheckNull = 1 THEN 'NO'
WHEN (I.CheckLine1 = 1 AND CONVERT(DECIMAL(5, 2), [LINE1_OPEN_LOOP_VOLTAGE]) >= 0.0) THEN 'YES'
WHEN (I.CheckLine2 = 1 AND CONVERT(DECIMAL(5, 2), [LINE2_OPEN_LOOP_VOLTAGE]) >= 0.0) THEN 'YES'
ELSE 'CHECK BUSINESS LOGIC'
END AS 'REVERSE POLARITY ISSUE'
FROM mynvarcharstuff N
JOIN numeric_ids I ON I.ID = N.ID
由于我们不能即时转换列,我们需要首先检查它们是否能够被转换,然后查看它们是正数还是 NULL。
请注意,这不是一个完美的解决方案。如果你有关于 NULL 是否必须存在于 Line1 中的规则,如果它出现在 Line2 中,反之亦然,它可以工作。
但你最好用这样的方式清理数据:
DELETE
FROM mynvarcharstuff
WHERE (ISNUMERIC(LINE1_OPEN_LOOP_VOLTAGE) = 0 AND LINE1_OPEN_LOOP_VOLTAGE IS NOT NULL)
OR (ISNUMERIC(LINE2_OPEN_LOOP_VOLTAGE) = 0 AND LINE2_OPEN_LOOP_VOLTAGE IS NOT NULL)