Sql 对照数据库中的值列表进行检查
假设TableA有一个字段叫做FieldA。FieldA由逗号作为分隔符的值列表组成(即1,2,3,4)#MyVar#包含我要搜索的值(单个值,而不是列表)。除了做以下工作之外Sql 对照数据库中的值列表进行检查,sql,sql-server,Sql,Sql Server,假设TableA有一个字段叫做FieldA。FieldA由逗号作为分隔符的值列表组成(即1,2,3,4)#MyVar#包含我要搜索的值(单个值,而不是列表)。除了做以下工作之外 SELECT * FROM TableA WHERE FieldA LIKE '%,#MyVar#,%' OR FieldA LIKE '#MyVar#,%' OR FieldA LIKE '%,#MyVar#' 是否有SQL命令/保留字来执行与上述SQL语句等效的操作?您可以在中使用以检查列表:
SELECT *
FROM TableA
WHERE FieldA LIKE '%,#MyVar#,%'
OR FieldA LIKE '#MyVar#,%'
OR FieldA LIKE '%,#MyVar#'
是否有SQL命令/保留字来执行与上述SQL语句等效的操作?您可以在中使用以检查列表:
SELECT * FROM TableA WHERE FieldA IN '%,#MyVar#,%'
您可以使用中来检查列表:
SELECT * FROM TableA WHERE FieldA IN '%,#MyVar#,%'
您有一个设计糟糕的非规范化数据库。如果可能的话,修复设计
如果这是不可能的,那么考虑MyVaR值的性质。如果它们不可能嵌套在彼此内部(例如,它们都保证具有相同数量的字符),则可以使用一个单独的like。如果没有,您的解决方案将与您得到的一样好。
您有一个设计糟糕、非规范化的数据库。如果可能的话,修复设计如果这是不可能的,那么考虑MyVaR值的性质。如果它们不可能嵌套在彼此内部(例如,它们都保证具有相同数量的字符),则可以使用一个单独的like。如果没有,您的解决方案将与您得到的一样好。
不需要包含几个or或逗号。这个查询应该满足您的需要SELECT *
FROM TableA
WHERE FieldA LIKE '%#MyVar#%'
如果变量出现在字段中的任何位置,将返回该行。您不必尝试将其与每个字段中的每个“列表”项进行比较
通过在单个字段中包含值列表,您有点滥用数据库设计。据我所知,没有任何处理此类数据的内置SQL函数。不需要包含几个or或逗号。这个查询应该满足您的需要
SELECT *
FROM TableA
WHERE FieldA LIKE '%#MyVar#%'
如果变量出现在字段中的任何位置,将返回该行。您不必尝试将其与每个字段中的每个“列表”项进行比较
通过在单个字段中包含值列表,您有点滥用数据库设计。据我所知,没有任何处理此类数据的内置SQL函数。根据:
这很可能是最糟糕的方式
您可以将这些数据存储在
数据库不,说真的。他们有
30年后做这件事的更好方法
几年前。你创造了一个可怕的世界
刚刚开始出现的问题
它丑陋的脑袋。它只会继续下去
更糟的是,让你的
公司越来越多的钱要花
维持
答案是创建一个新表,在主ID和不同值之间具有一对多关系。然后是一个简单得多的查询:
SELECT MainID
FROM NewTable
WHERE FieldA = @Value
这是一个更容易编码的解决方案,更不用说理解了。当您必须将此表加入其他表时,它将非常有帮助
编辑:从您的回答中,我了解到这样做将是一项艰巨的工作。但是,您已经遇到了当前设置中出现的问题。这样做需要时间,但从长远来看,它将使未来的发展大大加快。根据:
这很可能是最糟糕的方式
您可以将这些数据存储在
数据库不,说真的。他们有
30年后做这件事的更好方法
几年前。你创造了一个可怕的世界
刚刚开始出现的问题
它丑陋的脑袋。它只会继续下去
更糟的是,让你的
公司越来越多的钱要花
维持
答案是创建一个新表,在主ID和不同值之间具有一对多关系。然后是一个简单得多的查询:
SELECT MainID
FROM NewTable
WHERE FieldA = @Value
这是一个更容易编码的解决方案,更不用说理解了。当您必须将此表加入其他表时,它将非常有帮助
编辑:从您的回答中,我了解到这样做将是一项艰巨的工作。但是,您已经遇到了当前设置中出现的问题。这样做需要时间,但从长远来看,它将使未来的发展大大加快。不,一句话。在规范化数据库中,您通常会将这些列表项拆分为一个单独的表,但有时这是不可能的(用户无法更改数据库结构)或不希望的(预算限制) 你也可以
- 照杜里莱的建议做 (不适用于大量的 数据,但可能是最容易找到的 实施)
- 使用触发器在中拆分条目
您到达时(即插入时)插入子表(
),以及 那就做吧subtable a
不,一句话。在规范化数据库中,您通常会将这些列表项拆分为一个单独的表,但有时这是不可能的(用户无法更改数据库结构)或不希望的(预算限制) 你也可以
- 照杜里莱的建议做 (不适用于大量的 数据,但可能是最容易找到的 实施)
- 使用触发器在中拆分条目
您到达时(即插入时)插入子表(
),以及 那就做吧subtable a
将分隔符也放在like比较的左侧,然后确保在右侧包含分隔符。像这样:
SELECT *
FROM TableA
WHERE ',' + FieldA + ',' LIKE '%,#MyVar#,%'
将分隔符也放在like比较的左侧,然后确保在右侧包含分隔符。像这样:
SELECT *
FROM TableA
WHERE ',' + FieldA + ',' LIKE '%,#MyVar#,%'
这实际上应该在MySQL中实现。。。是正确的还是我遗漏了什么
where find_in_set('1', field_with_a_list_of_numbers)
这实际上应该在MySQL中实现。。。是正确的还是我遗漏了什么
where find_in_set('1', field_with_a_list_of_numbers)
是的,但是'A,B,C'不在('A')(你需要在列表中加上括号)。我想要与此完全相反的结果。FieldA是一个列表#MyVar#是一个值,而不是一个列表。是的,但是'a,B,C'不在('a')(列表中需要括号)。我想要与此完全相反的结果。