如何从数据库中选择具有以varchar逗号分隔的ID的所有行。例如,我有一个表格:
, 7, 9, 11
如何使用这些ID选择行?
答案 0 :(得分:4)
规范化您的数据库。您最有可能使用查找表。
答案 1 :(得分:1)
您有两个选择:
答案 2 :(得分:0)
select * from table_name where id in (7, 9, 11)
如果您在开始时通常使用该逗号,则需要先将其删除。
答案 3 :(得分:0)
对('7,9,11')
使用匹配(列)
这将显示你的id的所有varchar列,其中有7,9,11。 但你必须保持你的专栏有全文索引。
答案 4 :(得分:0)
就在昨天,我正在修复一个旧应用程序中的错误,并看到他们在哪里处理它:
AND (T.ServiceIDs = '#SegmentID#' OR T.ServiceIDs LIKE '#SegmentID#,%'
OR T.ServiceIDs LIKE '%,#SegmentID#,%' OR T.ServiceIDs LIKE '%,#SegmentID#')
我假设您说的是来自数据库的ServiceID的值可能包含7,9,11,并且变量SegmentID是一个或多个值。它是在一个CFIF语句中检查SegmentID实际上是否有一个值(由于先前的逻辑将默认值,这总是如此。
我个人虽然会像其他人建议的那样做,但我会创建我一直称为桥接表的桥接表,允许你从一个表中获得与另一个PK相关的0到多个PK。
多年前我不得不解决这个问题,我无法更改表结构,我创建了一个自定义表类型和一组函数,因此我可以通过SQL处理这些值,就像它们来自一个表一样。那个自定义表类型的解决方案虽然是特定于Oracle的,但我不知道如何在没有我研究的情况下在MySQL中这样做。
答案 5 :(得分:0)
有一个原因查询列表非常困难:数据库不适用于分隔列表。它们经过优化,可以最好地处理行(或集合)数据。创建正确的表结构将带来更好的查询性能和更简单的SQL查询。 (因此,虽然技术上可行,但您应该认真考虑将数据库规范化,如托德和其他人所建议的那样。)
Many-to-many关系最好用三(3)个表来表示。假设您正在销售"小部件"在各种"尺寸"。创建两个表示主要实体的表:
小工具 (独特的小部件)
WidgetID | WidgetTitle
1 | Widget 1
2 | Widget 2
....
尺寸 (独特尺码)
SizeID | SizeTitle
7 | X-Small
8 | Small
9 | Medium
10 | Large
11 | X-Large
然后创建一个联结表,以存储这两个实体之间的关系,即哪些小部件可用的大小
WidgetSize (每个小部件的可用尺寸)
WidgetID | SizeID
1 | 7 <== Widget 1 "X-Small"
1 | 8 <== Widget 1 + "Small"
2 | 7 <== Widget 2 + "X-Small"
2 | 9 ....
2 | 10
2 | 11
....
使用该结构,您可以轻松返回具有任何(或全部)大小列表的所有小部件。没有测试,但类似于下面的sql应该工作。
查找任何尺寸的小部件:<cfset listOfSizes = "7,9,11">
SELECT w.WidgetID, w.WidgetTitle
FROM Widget w
WHERE EXISTS
( SELECT 1
FROM WidgetSize ws
WHERE ws.WidgetID = w.WidgetID
AND ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
)
查找所有三种尺寸的小部件:<cfset listOfSizes = "7,9,11">
SELECT w.WidgetID, w.WidgetTitle, COUNT(*) AS MatchCount
FROM Widget w INNER JOIN WidgetSize ws ON ws.WidgetID = w.WidgetID
WHERE ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
GROUP BY w.WidgetID, w.WidgetTitle
HAVING MatchCount = 3