如何在不使用 RawSQL 的情况下使用 Regex 捕获组注释 Django 查询集,以便以后可以使用该值进行过滤和排序?
例如,在 PostgreSQL 中,我可以进行以下查询:
CREATE TABLE foo (id varchar(100));
INSERT INTO foo (id) VALUES ('disk1'), ('disk10'), ('disk2');
SELECT
"foo"."id",
CAST((regexp_matches("foo"."id", '^(.*\D)([0-9]*)$'))[2] AS integer) as grp2
FROM "foo"
ORDER BY "grp2"
Run Code Online (Sandbox Code Playgroud)
我strnatcmp在比较函数中用于对表中的人名进行排序.对于我们的比利时客户,我们得到了一些奇怪的结果.他们的名字有'Van der Broecke'和'Vander Veere',然后strnatcasecmp("Van der", "Vander")回归0!
由于自然比较的目的是按照人类的意愿进行排序,我不明白为什么空间被完全忽视.
例如:
$names = array("Van de broecke", "Vander Veere", "Vande Muizen", "Vander Zoeker", "Van der Programma", "vande Huizen", "vande Kluizen", "vander Muizen", "Van der Luizen");
natcasesort($names);
print_r($names);
Run Code Online (Sandbox Code Playgroud)
得到:
Array (
[0] => Van de broecke
[5] => vande Huizen
[6] => vande Kluizen
[2] => Vande Muizen
[8] => Van der Luizen
[7] => vander Muizen
[4] => Van der Programma
[1] => Vander Veere
[3] => Vander …Run Code Online (Sandbox Code Playgroud) 我需要使用varchar列来命令选择查询,使用数字和文本顺序.查询将在java程序中完成,使用jdbc over postgresql.
如果我ORDER BY在select子句中使用,我会得到:
1
11
2
abc
Run Code Online (Sandbox Code Playgroud)
但是,我需要获得:
1
2
11
abc
Run Code Online (Sandbox Code Playgroud)
问题是该列还可以包含文本.
这个问题类似(但针对SQL Server):
如何在SQL Server中对包含单词和数字的VARCHAR列进行排序?
但是,提出的解决方案不适用于PostgreSQL.
在此先感谢,问候,
我最近了解到PHP已经通过intl扩展支持Unicode Collation算法:
$array = array
(
'al', 'be',
'Alpha', 'Beta',
'Álpha', 'Àlpha', 'Älpha',
'????',
'img10.png', 'img12.png',
'img1.png', 'img2.png',
);
if (extension_loaded('intl') === true)
{
collator_asort(collator_create('root'), $array);
}
Array
(
[0] => al
[2] => Alpha
[4] => Álpha
[5] => Àlpha
[6] => Älpha
[1] => be
[3] => Beta
[11] => img1.png
[9] => img10.png
[8] => img12.png
[10] => img2.png
[7] => ????
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,即使使用混合大小写字符串,这似乎也能完美运行!到目前为止我遇到的唯一缺点是没有对自然排序的支持,我想知道解决这个问题的最佳方法是什么,这样我就可以合并两个世界中最好的一个.
我试图指定Collator::SORT_NUMERIC排序标志,但结果更加混乱:
collator_asort(collator_create('root'), $array, Collator::SORT_NUMERIC);
Array …Run Code Online (Sandbox Code Playgroud) 我认为这很容易找到premade,但似乎我在网上找到的任何解决方案只能解决部分问题.
我想对用户提供的文件名列表(文件大多以人和/或地址命名),有时用不同的语言(大多数是德语,有点法语和意大利语混合在一起) ,很少有任何其他西方语言).
我们的想法是以(德国)用户普遍认为理智的方式呈现此列表.这意味着顺序应该遵循Locale.GERMAN的java.text.Collator,但同时期望是对字符串中的数字进行异常,因此"10"在"2"之后.
我找到了在网上进行自然排序的代码,但它依赖于逐字符比较(而Collator不支持).我可以使用子字符串来破解某些内容,但在比较器内部,我认为在每次比较调用时创建多个子字符串并不是最明智的想法.
任何想法如何有效地实现这一点(在执行时间和实现时间),或者更好的是经过测试和随时可用的实现?
在许多编程语言中,您可以使用>,> =,<etc等运算符来比较字符串,并且语言将基于字母表中字母位置的比较.
例如在PHP中
if ('a' < 'b') {
echo 'Yes';
} else {
echo 'No';
}
> Yes
Run Code Online (Sandbox Code Playgroud)
但是在postgres或mysql中
SELECT
CASE WHEN 'a' < 'b' THEN 'yes' END
FROM table
Output: null
Run Code Online (Sandbox Code Playgroud)
我有一个包含字符串的表,我需要通过SQL相互比较.
例如:6.2(5a)6.2(5b) - 这将大于6.2(5a)或6.2(15) - 这将大于6.2(5a)
我想过使用正则表达式给一个字母分配一个数字但是当没有字母时这会打破比较.
你会如何在SQL中纯粹地解决这个问题?
我正在开发一个系统,该系统列出了按产品代码分类的一系列产品。产品代码由两个字母组成,后跟一个数字,例如EG1。
我目前通过简单的方式对这些产品进行分类
Product.objects.order_by('product_code'),
但是,由于可以有多个数字的产品代码(例如EG12),因此它们将比单个数字的代码高出一些。即EG1,EG11,EG12,EG13 ... EG19,EG2,EG20等
我知道在产品代码中添加前导零将解决此问题(即EG01而不是EG1),但是由于已经有印刷文献,并且现有站点使用EG1,因此这不是一个选择。
有没有一种方法可以解决此问题,以正确的顺序显示这些产品?
感谢您花时间阅读所有这些,很多!感谢所有爱好者!
如何自然排序?
即.命令一组字母数字数据显示为:
Season 1, Season 2, Season 10, Season 20
Run Code Online (Sandbox Code Playgroud)
代替
Season 1, Season 10, Season 2, Season 20
Run Code Online (Sandbox Code Playgroud)
我以非常实用的格式使用一个非常实用的电视季节示例作为案例.
我希望完成以下任务:
我花了大约2个小时在线研究,另外3个小时建立了这个解决方案.一些参考资料来自:
在SO和其他站点上找到的一些解决方案仅适用于90%的案例.但是,如果文本中有多个数值,则大多数/全部都不起作用,或者如果文本中根本没有找到数字,则会导致SQL错误.
我创建了这个SQLFiddle链接来玩(包括以下所有代码).
这是create语句:
create table tvseason
(
title varchar(100)
);
insert into tvseason (title)
values ('100 Season 03'), ('100 Season 1'),
('100 Season 10'), ('100 Season 2'),
('100 Season 4'), ('Show Season 1 (2008)'),
('Show Season 2 (2008)'), ('Show Season 10 (2008)'),
('Another Season 01'), …Run Code Online (Sandbox Code Playgroud) 我想订购一个包含不同选项的字符串列表.选项包括:
我有所有分支机构除外:
区分大小写,逻辑排序.
(非常多来自php的NatSort)
现在我正在尝试找到一个能够满足我需要的功能.
为了得到一个不区分大小写的逻辑顺序,我实现了对shlwapi.dll中的StrCmpLogicalW-Function的调用
https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-strcmplogicalw
但是,我找不到与StrCmpLogicalW等效的区分大小写.
我复制了一个看起来很有希望从另一个在线棋盘上玩的功能,并且使用Flags.
原始功能:
function NatCompareText(const S1, S2: WideString): Integer;
begin
SetLastError(0);
Result:=CompareStringW(LOCALE_USER_DEFAULT,
NORM_IGNORECASE or
NORM_IGNORENONSPACE or
NORM_IGNORESYMBOLS,
PWideChar(S1),
Length(S1),
PWideChar(S2),
Length(S2)) - 2;
case GetLastError of
0: ;
//some ErrorCode-Handling
else
RaiseLastOSError;
end;
end;
Run Code Online (Sandbox Code Playgroud)
来自:https: //www.delphipraxis.net/29910-natuerliche-sortierungen-von-strings.html
我试图删除Ignore-Case标志,但无济于事.
这就是我想要的结果:http: //php.fnlist.com/array/natsort
Input: array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
Output: array("Img1.png", "Img2.png", "Img12.png", "iMg10.png")
Run Code Online (Sandbox Code Playgroud)
而不是:http: //php.fnlist.com/array/natcasesort
Input: array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
Output: array("Img1.png", "Img2.png", "iMg10.png", "Img12.png")
Run Code Online (Sandbox Code Playgroud)
更新:
我已经为区分大小写的自然分类完成了第一个非常简单的解决方案.
我这样做的原因是因为我想在多个列上对Stringgrid进行排序,并为每个指定的列提供不同的选项. …
我有两列,id integer和version text.我试图将字符串转换version为整数,以便我可以选择id的最大(最新)版本.
但是,id商店本身的第一个实例为version.例:
id | version
---+--------
10 | '10'
Run Code Online (Sandbox Code Playgroud)
而不是:
id | version
---+--------
10 | '10-0'
Run Code Online (Sandbox Code Playgroud)
其他行遵循约定ID:10,版本:10-1.等等.
我怎么能做到这一点?我已经尝试split_part()并施展为int.但是,split_part(version, "-", 2)将返回看起来像空字符串的内容.我尝试使用a COALESCE(splitpart..., '0')无效,因为它试图读取字段索引2返回的空字段.