Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对照数据库中的值列表进行检查_Sql_Sql Server - Fatal编程技术网

Sql 对照数据库中的值列表进行检查

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语句等效的操作?您可以在中使用以检查列表:

假设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 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')(列表中需要括号)。我想要与此完全相反的结果。