如何进行查询以检查字段的值

时间:2019-04-25 23:35:58

标签: sql-server tsql

我有这张桌子:

-----------------------------------------------
code  intvalue        checkrole         result
-----------------------------------------------

A01    14             A02-A03           true
A02    24             A04               false
A03    10             A04               false
A04    12             A02/2             true

我想根据列checkrole中描述的角色,用Excel或类似的查询来填充查询或sp的列结果?

我向所有人道歉,我错误地解释了自己。 例如: A01 14 A02-A03是 在这种情况下,我想解释角色并获得24-10 = 14,即为真

更新2: 大家好,感谢您的关注。 HABO,我正在朝着这个方向努力``将值代入表达式(“ 24-10”)....“:

TBL

code intValue checkRule                   result
A01  14       select A02-A03 from Table_1 NULL
A02  24       select A04 from Table_1     NULL
A03  10       select A04 from Table_1     NULL
A04  12       select A02 / 2 from Table_1 NULL

SP

CREATE PROCEDURE [dbo]. [Test]
AS
BEGIN

DECLARE @code VARCHAR (50)
DECLARE @intvalue INT
DECLARE @checkrule VARCHAR (50)

DECLARE @cTbl AS CURSOR
SET @cTbl = CURSOR FOR SELECT code
, intValue
, checkRule
FROM [dbo]. [Table_1]

OPEN @cTbl FETCH NEXT FROM @cTbl INTO @code, @intvalue, @checkrule
WHILE @@ FETCH_STATUS = 0
BEGIN

declare @statement nvarchar (4000), @Result int, @Parm nvarchar (20)
SET @statement = 'select @Result = 11 + 7'
SET @Parm = '@Result int output'
EXEC sp_executesql @statement, @Parm, @ Result OUT
print @Result

FETCH NEXT FROM @cTbl INTO @code, @intvalue, @checkrule
END
CLOSE @cTbl
DEALLOCATE @cTbl
END

更新3: 这就是我想要的。我不是专家,但是我会从错误中学习,我感谢那些教给我一些新知识的人,感谢所有参与其中的人,尤其是感谢HOBO,大家晚上好

3 个答案:

答案 0 :(得分:0)

我可能会编写一个从您的checkRole创建值列表的函数(例如,它将为我提供A02-A04的列表“ A02”,“ A03”,“ A04”,然后使用其中包含“声明”

答案 1 :(得分:0)

使用显示的表格,您可以在下一个查询中更新结果列的值

UPDATE TableName
  SET result = CASE
    WHEN checkrole = 'A02-A03' THEN "true"
    WHEN checkrole = 'A04' THEN "false"
    WHEN checkrole = 'A02/2' THEN "true"
    ELSE "setDefaultValue" 
    END
WHERE code  in (A01,A02,A03,A04);

在最后一行指定要更新的行的代码值。如果您在列结果为空的情况下执行此查询,它将完成表并将结果存储为与您在上面发布的数据相同的数据。

(该查询在Mysql上运行良好)

答案 2 :(得分:0)

执行摘要:这是一个糟糕的主意。慢慢退后,没有人受伤。

免责声明:超出这一点,我对阅读后所需的任何治疗费用概不负责。

在更新2中,您似乎可以控制test = '"RT @Acosta: Trump defends his “very fine people” comments on Charlottesville: “People were there protesting the taking down of the monument…"' mention = test.split('@') person = mention[1].split(':') print(person[0]) 的格式。要求用户定界CheckRule容易得多,例如使用Code而不是'«A04»',而不是尝试使用TSQL查找它们。您无需担心诸如'A04''A02'时将66替换为CheckRule并获得'A026 - BA02'的问题。

接下来的事情简直令人恐惧。它演示了采用带分隔符“变量”的表达式进行暴力破解的方法,例如'666 - B66',将每个“变量”的所有出现都替换为其整数值,评估结果表达式并检索结果。

它没有使用像游标那样令人讨厌的东西,而是使用两个嵌套的游标在'«A04»'CheckRule之间移动。解析表达式中的“变量”并根据需要替换值会比使用“尝试一切”方法更为有效,但是TSQL在实现parsers方面并不擅长。

为了获得额外的荣誉,它也带来了拥抱SQL Injection的祝福。尝试使用Code之类的CheckRule。不要尝试像'A01; select 1 / 0;'这样的人。

'-1; drop database LuckyGuess;'

如果不清楚,请不要。只是不要。