【问题标题】:SQL Alphabetical Select StatementSQL 按字母顺序选择语句
【发布时间】:2015-04-10 17:52:06
【问题描述】:

我只是想知道是否可以编写一个 SQL 语句,该语句可以按列选择包含以字母开头的字符的行

说我有桌子

CREATE TABLE data (
    d_idno SERIAL PRIMARY KEY,
    d_idch CHAR(3) NOT NULL,
    d_desc CHAR(25) NOT NULL
);

里面有以下数据

INSERT INTO data (d_idch, d_desc)
VALUES('BLK', 'black item'),
      ('PNK', 'pink item'),
      ('GRN', 'green item'),
      ('BLU', 'blue item'),
      ('CYA', 'cyan item');

我想按照以下方式执行一条 SQL 语句

SELECT * FROM data
WHERE d_idch > 'BL'    # I'd like to find a way to replace this line
ORDER BY d_idch

这当然是错误的,但我想在按字母顺序排列时选择包含字符“BL”的行之后的每一行

【问题讨论】:

  • 为什么错了?这将选择具有 'BL' 和更大的每一行。
  • 是的,但我希望它不包含具有 BL 的行,我希望行包含字母表后面的前两个字符
  • 最好不要使用 WHERE d_idch > 'BM'

标签: sql postgresql select alphabetical


【解决方案1】:

您可以在 WHERE 子句中添加另一个条件以保留 BL 结果:

SELECT * FROM data
WHERE 
  d_idch > 'BL' 
  AND SUBSTRING(d_idch FROM 1 FOR 2) <> 'BL'
ORDER BY d_idch

通过这种方式,您可以获得大于 BL 的所有内容,但不会获得以 BL 开头的任何内容

作为替代方案,您可以在BL 末尾添加ZZZZZZ

SELECT * 
FROM data
WHERE d_idch > 'BLZZZZ'  
ORDER BY d_idch

还有另一种选择,我认为它可能更接近您正在寻找的东西(尽管所有结果都相同):

SELECT * 
FROM data
WHERE 
  SUBSTRING(d_idch FROM 1 FOR 2) > 'BL'  
ORDER BY d_idch

SQL Fiddle here

如果表很大,您可能会发现第二个是最快的,因为您的数据库不必将每个d_idch 作为逻辑的一部分substring。权衡取舍...

【讨论】:

  • 啊,子字符串看起来正是我需要的,我只是不喜欢使用不清楚的 SQL,所以子字符串我可以更具体。第三个答案是完美的,非常感谢
  • 数据库非常大,这就是为什么我想用它一次遍历表位,对行 A 到 E 然后 F 到 J 等运行查询。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多