2

我想选择行,直到找到某个值并且它不是数字,所以我不能使用 > 或 <。我怎样才能做到这一点 ?

例子 :

-----
Value
-----
45
434
348
213
543
3445
343
123
34345

我想选择 543 之前的所有记录(不按任何顺序排序)

提前致谢

4

3 回答 3

4

解决了“没有顺序”的问题,也就是说,您将不得不选择某种顺序(例如主键的顺序,或者记录分配 OID 的顺序),您的问题就变成了:

"I want all the records whose ordering field is less than the value
 of the row for which ordering field is minimum, and VALUE is 543".

因此,您选择值为 543 的最小行

SELECT MIN(id) AS id FROM yourtable WHERE value = 543

或者,出于其他目的,可能类似于

SELECT MIN(id) AS id FROM yourtable WHERE value >= 543

然后选择该记录之前的所有记录:

SELECT value FROM yourtable WHERE id < ( SELECT MIN(id) AS id FROM yourtable WHERE value = 543 );

所以你的桌子可能是:

ID    Value
-----------
1     45
2     434
3     348
4     213
5     543
6     3445
7     343
8     123
9     34345

你会得到:

45
434
348
213
543

您看不到订单,但必须有一个。这是上的订单id

根据您的要求,value可以是任何内容 - 文本,甚至是图像 BLOB - 并且“排序”保持隐藏状态。

在其他一些语言中,您会执行以下操作:

qry = SQL.exec('SELECT * FROM yourtable;');
while ((value = qry.next().value) != '543':
    write value '\n'
qry.close()

但是要么SELECT没有指定 ' 的顺序,你可能每次都会得到不同的结果,或者它是表中元组插入的顺序。这与显式使用相同id

于 2012-10-22T21:11:56.367 回答
4

这个答案可能会迟到,但因为它是谷歌上的第一个结果,术语为“mysql select until”,希望这可能对某人有所帮助。

您可以做的是声明一个标记,如果您找到所需的值,请将标记设置为除NULL. 然后我们可以ISNULL用来检查我们是否已经到达该行。

SET @marker = NULL;
SELECT value FROM table1 WHERE ISNULL(@marker:=IF(value=543,value,@marker));

这是一个演示

于 2017-07-11T08:55:11.937 回答
-5

您可以在查询中使用相等比较器,直接搜索您要查找的值。

当您可以指定要搜索的内容时,为什么要遍历数据库直到找到它?

您没有举例说明您要搜索的值是什么,所以如果它是一个字符串

Select x.* from table x WHERE x.Column = 'String Value'

但是,如果您确实想在数据库上增加一些额外的负载(在这种未定义的情况下),您将拥有一个存储过程,循环访问存储在数据库中的 ID。

为此,请查看以下帖子,它可能会给您一些启发:基于 ID 列表的 SQL LOOP INSERT

于 2012-10-22T20:44:41.410 回答