我有以下SQL语句列出表的所有列,并且由于某种原因它忽略了where子句的最后两行:
AND t.name ='table1'
AND s.name = 'dba'
我做错了什么? 这是完整的SQL代码:
SELECT DB_Name() AS DatabaseName
,s.[name] AS SchemaName
,t.[name] AS TableName
,c.[name] AS ColumnName
,'[' + DB_Name() + ']' + '.[' + s.NAME + '].' + '[' + T.NAME + ']' AS FullQualifiedTableName
,d.[name] AS DataType
FROM sys.schemas s
INNER JOIN sys.tables t ON s.schema_id = t.schema_id
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types d ON c.user_type_id = d.user_type_id
WHERE d.NAME LIKE '%int%'
OR d.NAME LIKE '%float%'
OR d.NAME LIKE '%decimal%'
OR d.NAME LIKE '%numeric%'
OR d.NAME LIKE '%real%'
OR d.NAME LIKE '%money%'
AND is_identity = 0
AND t.name ='table1'
AND s.name = 'dba'
答案 0 :(得分:3)
将所有d.Name语句放入'()'
WHERE (d.NAME LIKE '%int%'
OR d.NAME LIKE '%float%'
OR d.NAME LIKE '%decimal%'
OR d.NAME LIKE '%numeric%'
OR d.NAME LIKE '%real%'
OR d.NAME LIKE '%money%') AND ...
答案 1 :(得分:2)
在上下文中阅读这个问题我无法确定你想要的结果。我假设您希望所有AND
都是真的,并且OR
之一。在这种情况下,您应该像这样修改您的查询:
WHERE (d.NAME LIKE '%int%'
OR d.NAME LIKE '%float%'
OR d.NAME LIKE '%decimal%'
OR d.NAME LIKE '%numeric%'
OR d.NAME LIKE '%real%'
OR d.NAME LIKE '%money%')
AND is_identity = 0
AND t.name ='table1'
AND s.name = 'dba';
注意添加的括号。这些指定您希望括号中的一个子句和外部的所有子句都为真。该主题称为逻辑运算符优先级,并在this线程中进行了深入讨论。简而言之,它的工作方式与数学中的操作顺序类似。您可以使用括号并指定所需的顺序,也可以让SQL为您选择。您可以阅读更多相关信息here。另外,here是一篇专门针对您的案例的文章(AND
和OR
的组合。
但是,我不能确定这是否是你想要的。 SQL也无法确定,这就是你得到“错误”结果的原因。
答案 2 :(得分:1)
使用括号对where子句进行分组("和"和"或")。我在手机上,所以我没有尝试自己,但我怀疑布尔运算符优先问题......