SQL 即使函数返回正确的值,查询也会返回格式不正确的数据
SQL Query returning incorrectly formatted data even though the function is returning the correct values
我的 table 中的数据代表具有以下数据的物理位置:自治市名称、州(province/region)和由前缀和后缀分隔的唯一 ID破折号(所有 NVARCHAR)。
Name
State
UniqueID
Atlanta
Georgia
A12-1383
UniqueID 中的破折号并不总是位于同一位置(可以是 A1-XYZ、A1111-XYZ 等)。后缀始终是数字。
我的方法是结合使用 RIGHT
和 CHARINDEX
来首先找到破折号的索引,然后隔离破折号右侧的后缀,然后应用 MAX
到结果。到目前为止,我的问题是这种组合有时会返回 -1234
或 12-1234
之类的东西,即包括破折号和偶尔的一些前缀。正因为如此,max显然应用不正确。
到目前为止,这是我的查询:
select name, max(right(uniqueid,(Charindex('-',uniqueid)))) as 'Max'
from locations
where state = 'GA' and uniqueid is not NULL
group by name
order by name ASC
这是格式错误的行的结果:
Name
Max
Atlanta
11-2442
Savannah
-22
这会为 'Max' 返回格式不正确的数据,因此我隔离了这些函数。
CHARINDEX
正确返回破折号的位置,包括函数返回格式错误的数据的情况。由于破折号从不在同一个地方,我无法隔离 RIGHT
函数以查看是否是问题所在。
我是否错误地使用了这些功能?还是我的方法完全不正确?
谢谢!
CHARINDEX
正在计算 -
之前的字符数,即 左侧 上的字符数,因此使用 RIGHT
左边 的字符数不起作用。您需要找出 右边 上有多少个字符,这可以通过 LEN()
得到总长度减去左边的字符数。
SELECT RIGHT(MyColumn,LEN(MyColumn)-CHARINDEX('-',MyColumn))
FROM (
VALUES
('A12ssss-1383'),
('A12-13834'),
('A12ss-138')
) X (MyColumn);
我的 table 中的数据代表具有以下数据的物理位置:自治市名称、州(province/region)和由前缀和后缀分隔的唯一 ID破折号(所有 NVARCHAR)。
Name | State | UniqueID |
---|---|---|
Atlanta | Georgia | A12-1383 |
UniqueID 中的破折号并不总是位于同一位置(可以是 A1-XYZ、A1111-XYZ 等)。后缀始终是数字。
我的方法是结合使用 RIGHT
和 CHARINDEX
来首先找到破折号的索引,然后隔离破折号右侧的后缀,然后应用 MAX
到结果。到目前为止,我的问题是这种组合有时会返回 -1234
或 12-1234
之类的东西,即包括破折号和偶尔的一些前缀。正因为如此,max显然应用不正确。
到目前为止,这是我的查询:
select name, max(right(uniqueid,(Charindex('-',uniqueid)))) as 'Max'
from locations
where state = 'GA' and uniqueid is not NULL
group by name
order by name ASC
这是格式错误的行的结果:
Name | Max |
---|---|
Atlanta | 11-2442 |
Savannah | -22 |
这会为 'Max' 返回格式不正确的数据,因此我隔离了这些函数。
CHARINDEX
正确返回破折号的位置,包括函数返回格式错误的数据的情况。由于破折号从不在同一个地方,我无法隔离 RIGHT
函数以查看是否是问题所在。
我是否错误地使用了这些功能?还是我的方法完全不正确?
谢谢!
CHARINDEX
正在计算 -
之前的字符数,即 左侧 上的字符数,因此使用 RIGHT
左边 的字符数不起作用。您需要找出 右边 上有多少个字符,这可以通过 LEN()
得到总长度减去左边的字符数。
SELECT RIGHT(MyColumn,LEN(MyColumn)-CHARINDEX('-',MyColumn))
FROM (
VALUES
('A12ssss-1383'),
('A12-13834'),
('A12ss-138')
) X (MyColumn);