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 server 能否在SQL中将多个列名设置为要查询的宏?_Sql Server_Tsql - Fatal编程技术网

Sql server 能否在SQL中将多个列名设置为要查询的宏?

Sql server 能否在SQL中将多个列名设置为要查询的宏?,sql-server,tsql,Sql Server,Tsql,能否将SQL表中的多个列名设置为SQL中要查询的宏 例如,我多次遇到多个列,我是否可以使用宏或某种类型的引用来识别它们一次,以避免重复显示它们并使代码混乱 当前的代码可以工作,我只是在寻找一个更干净/精简的选项 当前代码: WHERE ('ABC') IN ([CODE1],[CODE2],[CODE3],[CODE4],[CODE5],[CODE6],[CODE7],[CODE8] ,[CODE9],[CODE10],[CODE11],[CODE12],[CO

能否将SQL表中的多个列名设置为SQL中要查询的宏

例如,我多次遇到多个列,我是否可以使用宏或某种类型的引用来识别它们一次,以避免重复显示它们并使代码混乱

当前的代码可以工作,我只是在寻找一个更干净/精简的选项

当前代码:

WHERE ('ABC') IN 
        ([CODE1],[CODE2],[CODE3],[CODE4],[CODE5],[CODE6],[CODE7],[CODE8]
        ,[CODE9],[CODE10],[CODE11],[CODE12],[CODE13],[CODE14],[CODE15]
        ,[CODE16],[CODE17],[CODE18],[CODE19],[CODE20],[CODE21],[CODE22]
        ,[CODE23],[CODE24],[CODE25]
    AND ('CFS') IN 
        ([CODE1],[CODE2],[CODE3],[CODE4],[CODE5],[CODE6],[CODE7],[CODE8]
        ,[CODE9],[CODE10],[CODE11],[CODE12],[CODE13],[CODE14],[CODE15]
        ,[CODE16],[CODE17],[CODE18],[CODE19],[CODE20],[CODE21],[CODE22]
        ,[CODE23],[CODE24],[CODE25]
    ect...(20 more times)
目标:

这是继承的代码,看起来非常笨拙


谢谢

像这样编号的列几乎总是一个标志,表明您应该有一个额外的表。因此,如果您现有的表结构如下所示:

Table1 Table1ID, OtherFields, Code1, Code2, Code3.... Code25 Table1 Table1ID, OtherFields Table1Codes Table1ID, Code 或


像这样编号的列几乎总是一个标志,表明您应该有一个额外的表。因此,如果您现有的表结构如下所示:

Table1 Table1ID, OtherFields, Code1, Code2, Code3.... Code25 Table1 Table1ID, OtherFields Table1Codes Table1ID, Code 或


如果无法更改表的模式(通常情况下),则可以
UNPIVOT
it。例如,假设
CODE1
CODE25
来自
MyTable
,将
UNPIVOT
操作包装在CTE中:

;WITH
    cte AS 
    (
        SELECT      upvt.*
        FROM        MyTable
        UNPIVOT     (
                        CodeValue FOR CodeLabel IN ([CODE1], [CODE2], ..., [CODE25])
                    ) upvt
    )

SELECT      *
FROM        cte
WHERE       CodeValue IN ('ABC', 'DEF', ...)

取消PIVOT操作不是免费的。在取消激活该表之前,请确保尽可能多地从
MyTable
中进行筛选。

如果无法更改该表的架构(通常情况下),则可以
取消激活该表。例如,假设
CODE1
CODE25
来自
MyTable
,将
UNPIVOT
操作包装在CTE中:

;WITH
    cte AS 
    (
        SELECT      upvt.*
        FROM        MyTable
        UNPIVOT     (
                        CodeValue FOR CodeLabel IN ([CODE1], [CODE2], ..., [CODE25])
                    ) upvt
    )

SELECT      *
FROM        cte
WHERE       CodeValue IN ('ABC', 'DEF', ...)

取消PIVOT操作不是免费的。在取消激活之前,请确保尽可能多地从
MyTable
中进行筛选。

您可以创建一个值表,然后使用
join
中存在的任何有效的
。如果我理解你的目的。你是否在寻找一种方法,使你不必实际编写查询?这里没有足够的细节让你得到任何具体的帮助。如果你通读一遍,然后用详细信息编辑你的问题,你会在这里有更好的体验。有关提示,请参阅。害怕的人你不知道如何回答一个明智的问题…;)我将尝试重新措辞并添加一些细节。我认为有一个更优雅的解决方案,使用
交叉应用
(values(CODE1),(CODE2),…(CODE25))
。您可以创建一个值表,然后使用
连接
中存在的
子句中有效的
。如果我理解你的目的。你是否在寻找一种方法,使你不必实际编写查询?这里没有足够的细节让你得到任何具体的帮助。如果你通读一遍,然后用详细信息编辑你的问题,你会在这里有更好的体验。有关提示,请参阅。害怕的人你不知道如何回答一个明智的问题…;)我将尝试重新措辞并添加一些细节。我认为使用
交叉应用
(值(CODE1),(CODE2),…(CODE25))
是一种更优雅的解决方案。我不能拆分表格,但我可以创建一个新表格。这似乎更有效率。非常感谢。有道理。我不能拆分表格,但我可以创建一个新表格。这似乎更有效率。非常感谢。这很有趣,也可能有效。我将进一步探讨这一点。非常感谢。这很有趣,也可能有效。我将进一步探讨这一点。非常感谢。