sql查询复杂

时间:2009-12-17 09:24:28

标签: sql

我有一个表在一个名为test的表中有4个fields.one字段名为listing,我有1,2,3,4,5,6个多个值用逗号分隔,我需要检查是否在该表中在那个特定的字段中,一个id说4是否存在..通过sql查询。

6 个答案:

答案 0 :(得分:3)

您的数据库设计错误,这就是您查询数据时遇到问题的原因。您应该将值放在单独的表中,以便教导值在其自己的字段中。然后很容易找到记录:

select t.testId
from test t
inner join listing l on l.testId = t.testId
where l.id = 4

现在你必须使用一些丑陋的字符串比较来查找记录:

select testId
from test
where ','+listing+',' like '%,4,%'

答案 1 :(得分:3)

你可以尝试

SELECT *
FROM YourTable 
WHERE REPLACE(Col, ' ', '') LIKE '4,%' --Starts with
OR REPLACE(Col, ' ', '') LIKE '%,4' --Ends with
OR REPLACE(Col, ' ', '') LIKE '%,4,%' --Contains
OR REPLACE(Col, ' ', '') = '4' --Equals

感兴趣的是,看看这个

DECLARE @delimiter NVARCHAR(5),
        @Val INT

SELECT @Val = 40

SELECT  @delimiter = ','

DECLARE @YourTable TABLE(
        ID INT,
        Vals VARCHAR(50)
)

INSERT INTO @YourTable (ID,Vals) SELECT 1, '1,2,3,4,5,6,7,8'

DECLARE @TempTable TABLE(
        ID INT,
        Vals XML
)

INSERT INTO @TempTable 
SELECT  ID,
        CAST('<d>' + REPLACE(Vals, @delimiter, '</d><d>') + '</d>' AS XML)
FROM    @YourTable 

SELECT  *
FROM    @TempTable tt
WHERE   EXISTS(
            SELECT  T.split.value('.', 'nvarchar(max)') AS data
            FROM    tt.Vals.nodes('/d') T(split)
            WHERE   T.split.value('.', 'nvarchar(max)') = @Val
)

答案 2 :(得分:0)

常见的方法是将列表解析为表变量或表值函数,然后连接到表,或使用EXISTS子查询。

有很多关于如何做到这一点的例子:

http://www.bing.com/search?setmkt=en-US&q=SQL+parse+list+into+table

答案 3 :(得分:0)

您可以在where子句和select子句中使用instring函数:

甲骨文:

select substr(column, instr(column, '1', 1), 1)
where instr(column, '1', 1) > 0

如果您想要单个值,则有效。或者,您可以使用case或decode语句的组合为每个可能的值创建单个列:

select 
 decode(instr(column, '1', 1), 0, substr(column, instr(column, '1', 1), 1), null) c1,
 decode(instr(column, '2', 1), 0, substr(column, instr(column, '2', 1), 1), null) c2,
 decode(instr(column, '3', 1), 0, substr(column, instr(column, '3', 1), 1), null) c3

对于这种规范化程度较低的数据集,这种方法的优点是您可以将其保存为视图,然后在其上运行SQL,因此如果您保存上述内容,则可以使用:

select c1, c2 from view where c1 is not null or c2 is not null

NB。在其他dbms中,您可能必须使用不同的语法,可能是情况而不是解码语句

答案 4 :(得分:-1)

如果您需要找到4而且只有4(即不是14或24或40等),您应该使用

SELECT * FROM foo WHERE col LIKE '%, 4,%'

SELECT * FROM foo WHERE col LIKE '%,4,%'

如果逗号和数字之间没有空格

答案 5 :(得分:-3)

这个怎么样?

Select * From Foo Where Col like '%4%'